是否可以在 Unity 或其他类型的 IoC 库中像这样注入(inject)依赖项列表?
public class Crawler
{
public Crawler(IEnumerable<IParser> parsers)
{
// init here...
}
}
这样我就可以在我的容器中注册多个IParser,然后解析它们。
这可能吗?谢谢
最佳答案
这是可能的,但您需要应用一些解决方法。首先,您需要在 Unity 容器中为每个 IParser 注册一个名称。其次,您需要在容器中注册从 IParser[] 到 IEnumerable
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>();
我通过引入一个工厂来放弃这个解决方案,它封装了统一来构造所需的类型。在您的情况下,我会这样做。
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...
}
}
有了它,你可以按如下方式注册类型:
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>();
关于c# - 统一.NET : List of dependencies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7483308/