Unity .NET:依赖项列表

是否可以在Unity或其他类型的IoC库中注入这样的依赖项列表

public class Crawler { public Crawler(IEnumerable parsers) { // init here... } } 

通过这种方式,我可以在我的容器中注册多个IParser,然后解决它们。

可能吗? 谢谢

这是可能的,但您需要应用一些变通方法。 首先,您需要在Unity容器中使用名称注册每个IParser 。 其次,您需要在容器中注册从IParser []IEnumerable 的映射。 否则,容器无法将解析器注入构造函数。 以下是我以前的做法。

 IUnityContainer container = new UnityContainer(); container.RegisterType("SuperParser"); container.RegisterType("DefaultParser"); container.RegisterType("BasicParser"); container.RegisterType, IParser[]>(); container.RegisterType(); Crawler crawler = container.Resolve(); 

我通过引入一个工厂来废弃这个解决方案,这个工厂封装了统一来构建所需的类型。 以下是我将如何处理你的情况。

 public interface IParserFactory{ IEnumerable BuildParsers(); } public class UnityParserFactory : IParserFactory { private IUnityContainer _container; public UnityParserFactory(IUnityContainer container){ _container = container; } public IEnumerable BuildParsers() { return _container.ResolveAll(); } } public class Crawler { public Crawler(IParserFactory parserFactory) { // init here... } } 

有了这个,你可以注册类型如下:

 IUnityContainer container = new UnityContainer(); container.RegisterType(); container.RegisterType(); container.RegisterType(); container.RegisterType(); Crawler crawler = container.Resolve(); 

并不是说我说这是错的,但似乎你正在尝试解决一个插件模型,你可以通过使用MEF来轻松管理。 提示将被inheritance从界面导出,然后在需要解析器时执行ImportMany。

有很多方法可以在Unity中实现这一目标。 例如,

http://sharpsnmplib.codeplex.com/SourceControl/changeset/view/5497af31d15e#snmpd%2fapp.config

        

此构造函数需要一个User对象数组,并且在创建UserRegistry对象时,Unity会将此容器中定义的所有此类对象注入其中。

事实上,我不知道任何支持这个的容器。

但是,作为一般建议,如果可以,可以通过将该列表包装在组合中 ,并将该组合注入到使用者中来防止将服务列表注入到使用者中。 不将列表包装在复合中会使应用程序混乱使用额外的foreach循环,或者您需要做什么来处理该依赖项列表。 虽然这似乎并不坏,但这些依赖关系的消费者不应该关心。 但更糟糕的是,当我们想要改变处理服务列表的方式时,我们将不得不通过完整的应用程序,这违反了DRY原则。

当消费者(在您的情况下是Crawler )是Composition Root的一部分而不是应用程序本身时,此建议不成立。 此外,当应用程序只有一个消费者接受这种依赖时,它可能不是那么大的交易。

是的,你可以..你可以看看依赖注射器。 我是Autofac项目的忠实粉丝。

另一个选择是Ninject ,