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。
答案 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>();
通常,如果您需要将不同的注射成员应用于相同的混凝土类型,那么您将需要使用命名注册。