Is it possible to inject a list of dependencies like this in Unity or other kind of IoC libraries?
public class Crawler
{
public Crawler(IEnumerable<IParser> parsers)
{
// init here...
}
}
In this way I can register multiple IParser in my container and then resolve them.
Is it possible? Thanks
It is possible but you need to apply some workarounds. First you need to register each IParser with a name in the Unity Container. Second you need to register a mapping from IParser[] to IEnumerable<IParser> in the container. Otherwise the container cannot inject the parsers to the constructor. Here´s how i have done 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 have discarded this solution by introducing a factory, that encapsulates unity to construct the needed types. Here´s how i would 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) {
// init here...
}
}
With this you can register the 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>();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With