Es posible, pero es necesario aplicar algunas soluciones. Primero debe registrar cada IParser con un nombre en el contenedor Unity. En segundo lugar, debe registrar una asignación de IParser [] a IEnumerable <IParser> en el contenedor. De lo contrario, el contenedor no puede inyectar los analizadores al constructor. Así es como lo he hecho antes.
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>();
He descartado esta solución mediante la introducción de una fábrica, que encapsula la unidad para construir los tipos necesarios. Así es como lo haría en tu caso.
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...
}
}
Con esto se puede registrar los tipos de la siguiente manera:
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>();
posible duplicado de [Resolviendo IEnumerable con Unity] (http://stackoverflow.com/questions/1961549/resolving-ienumerablet-with-unity) –