当类注册了多个接口时,Unity会解析最后一次注册

时间:2013-07-25 11:55:37

标签: c# dependency-injection unity-container

public interface A
{
}
public interface B
{
}
public interface C : A, B
{
}
public class Foo : C
{
}
        IUnityContainer unity = new UnityContainer();
        unity.RegisterType<A, Foo>(new TransientLifetimeManager(), new InjectionFactory(container => { throw new Exception(); }));
        unity.RegisterType<B, Foo>(new TransientLifetimeManager(), new InjectionFactory(container => { throw new Exception(); }));
        unity.Resolve<A>(); //uses RegisterType<B, Foo> InjectionFactory

我希望Unity使用“A”InjectionFactory。

1 个答案:

答案 0 :(得分:3)

Unity仅为每个构建密钥维护一个构建计划,因此第二个注册将覆盖第一个注册(对于Foo)。

注册时,首先在A和Foo之间创建映射,然后根据构建密钥(Type:Foo,Name:null)将任​​何注入成员应用于目标类型(Foo)。

因此,A和Foo之间的映射与应用于Foo的注入成员是分开的。

为了更清楚地说明覆盖注册,我相信以下功能与您的配置相同:

unity.RegisterType<Foo>(new TransientLifetimeManager(), 
    new InjectionFactory(container => { throw new Exception(); }));

unity.RegisterType<Foo>(new TransientLifetimeManager(), 
    new InjectionFactory(container => { throw new Exception(); }));

unity.RegisterType<A, Foo>();

通常,如果您需要将不同的注射成员应用于相同的混凝土类型,那么您将需要使用命名注册。