Возможно, но вам нужно применить некоторые обходные пути. Сначала вам нужно зарегистрировать каждого IParser с именем в контейнере Unity. Во-вторых, вам нужно зарегистрировать сопоставление от 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>();