首页 > 解决方案 > Unity:告诉容器在注册类型时始终使用接口的特定实现

问题描述

我一直遇到这种情况:假设我有接口IFoo和几个实现,比如RedFoo : IFooBlackFoo : IFoo. 然后我有接受IFoo构造函数的类:

class BlackFooUser
{
   public BlackFooUser(IFoo foo, other_parameters_here) {...}
}

class RedFooUser
{
   public RedFooUser(IFoo foo, other_parameters_here) {...}
}

我如何告诉容器像往常一样解析所有其他参数,但总是BlackFoo在构造时使用BlackFooUser,并且总是RedFoo在构造时使用RedFooUser?我知道我可以ParameterOverride在调用时使用Resolve(),但我希望在Red/BlackFooUser解决 a 时它是相同的,所以这应该进入RegisterTypeor RegisterFactory

我可以做类似的事情

container.RegisterFactory<RedFooUser>(c=>new RedFooUser(c.Resolve<RedFoo>(), other_parameters_here));

但这非常冗长,每次添加新参数时都必须更改。

有没有更好的办法?

更新我特别希望通过容器注册来做到这一点,而不修改所涉及的类。造成这种情况的原因有很多,但归结为:

标签: c#inversion-of-controlunity-container

解决方案


当你注册你的类型时,你可以给它们一个名字,然后在这些类型被注入的构造函数中引用这个名字。像这样的东西:

public class BlackFoo : IFoo
{
    public const string UNITY_KEY = "BlackFoo";
}

在您的容器注册中:

_container.RegisterType<IFoo, BlackFoo>(BlackFoo.UNITY_KEY, new ContainerControlledLifetimeManager());

在您的构造函数中:

public class BlackFooUser
{
    public BlackFooUser([Dependency(BlackFoo.UNITY_KEY)] IFoo foo)
    {
    }
}

这确保了当容器进行依赖注入时,它将使用命名IFoo注册。


推荐阅读