Maybe, but you need to apply some workarounds. First you need to register each IParser with a name in the Unity container. Secondly, you need to register the mapping from IParser [] to IEnumerable <IParser> in the container. Otherwise, the container cannot inject parsers into the constructor. Here is how I did it before.
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>();
I discarded this solution by introducing a factory that encapsulates the unit to build the necessary types. This is how I will do it in your case.
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) {
With this, you can register types as follows:
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>();
Jehof
source share