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)