Unity .NET:依赖项列表

Ric*_*ald 8 c# dependency-injection ioc-container unity-container

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

public class Crawler 
{
    public Crawler(IEnumerable<IParser> parsers) 
    {
         // init here...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

可能吗?谢谢

Jeh*_*hof 10

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

IUnityContainer container = new UnityContainer();

container.RegisterType<IParser, SuperParser>("SuperParser");
container.RegisterType<IParser, DefaultParser>("DefaultParser");
container.RegisterType<IParser, BasicParser>("BasicParser");
container.RegisterType<IEnumerable<IParser>, IParser[]>();
container.RegisterType<Crawler>();

Crawler crawler = container.Resolve<Crawler>();
Run Code Online (Sandbox Code Playgroud)

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

public interface IParserFactory{
  IEnumerable<IParser> BuildParsers();
}

public class UnityParserFactory : IParserFactory {
  private IUnityContainer _container;

  public UnityParserFactory(IUnityContainer container){
    _container = container;
  }

  public IEnumerable<IParser> BuildParsers() {
    return _container.ResolveAll<IParser>();
  }
}

public class Crawler {
  public Crawler(IParserFactory parserFactory) {
     // init here...
  }
}
Run Code Online (Sandbox Code Playgroud)

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

IUnityContainer container = new UnityContainer();

container.RegisterType<IParser, SuperParser>();
container.RegisterType<IParser, DefaultParser>();
container.RegisterType<IParser, BasicParser>();
container.RegisterType<IParserFactory, UnityParserFactory>();

Crawler crawler = container.Resolve<Crawler>();
Run Code Online (Sandbox Code Playgroud)


cyb*_*zed 0

我并不是说这是错误的,但您似乎正在尝试解决一个可以使用 MEF 轻松管理的插件模型。提示将从接口继承 Export,然后在需要解析器时执行 ImportMany。