0
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。

4

1 回答 1

3

Unity 只为每个构建键维护一个构建计划,因此第二个注册会覆盖第一个注册(对于 Foo)。

注册时,首先在 A 和 Foo 之间创建一个映射,然后根据构建键(类型:Foo,名称: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>();

一般来说,如果您需要将不同的注入成员应用于相同的具体类型,那么您将需要使用命名注册。

于 2013-07-25T15:22:14.493 回答