How to inject IEnumerable using Microsoft Unity IO

2019-07-03 00:40发布

问题:

I have a Service that need inject more than one provider, see below for example. How to use Unity to implement this feature?

public class MyService: IMyService
{
    public MyService(IEnumerable<Provider> Providers);
}

回答1:

I know this is an old question, but maybe this will help someone else that stumbles upon this.

As long as you register the implementations with a specific name, this is possible to easily inject. You will then get all registered implementations.

public class MyService: IMyService
{
    public MyService(IProvider[] providers)
    {
       // Do something with the providers
    }
}

Just make sure to inject them as an array. Unity will understand this. And when you register them you can register them as such:

container.RegisterType<IProvider, FooProvider>("Foo");
container.RegisterType<IProvider, BarProvider>("Bar");


回答2:

One way is to inject the UnityContainer itself, and then resolve all the Providers you need:

public class MyService : IMyService 
{
    public class MyService(IUnityContainer iocContainer)
    {
        var providers = iocContainer.ResolveAll<IProvider>();
    }
}

The only thing you will need to do is register the UnityContainer with itself somewhere on setup:

unityContainer.Register<IUnityContainer>(unityContainer, new ContainerControllerLifetimeManager());