构造函数在Unity容器中注入多个实现

Seb*_*ten 7 c# dependency-injection unity-container

对于以下接口和类,如何使用Unity Container流水线(以编程方式)连接它以FooController获取实例ARepositoryBarController获取BRepositoryvia构造函数注入的实例?

public interface IRepository
{
}

public class ARepository : IRepository
{
}

public class BRepository : ARepository
{
}

public class FooController
{
    public FooController(IService service, IRepository repository)
    {
    }
}

public class BarController
{
    public BarController(IService service, IRepository repository)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

toa*_*akz 1

一种可能性是注册要在UnityContainer解析时解析的特定类型IRepository

IUnityContainer container = new UnityContainer();
container.RegisterType<IRepository, BRepository>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

使用它取决于您是否需要对在某些上下文中解析的类型进行更细粒度的控制 - 如果需要,您可以考虑使用本地IUnityContainer实例并RegisterInstance()改为使用:

//Assumes container is instantiated and already populated with other instances/type mappings.
IUnityContainer childContainer = container.CreateChildContainer();
container.RegisterInstance<IRepository>(new BRepository(), new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)