C# Unity解决类向多个接口注册时的最后一次注册 公共接口A { } 公共接口B { } 公共接口C:A,B { } 公开课Foo:C { } IUnityContainer unity=新的UnityContainer(); RegisterType(new TransientLifetimeManager(),new InjectionFactory(container=>{throw new Exception();})); RegisterType(new TransientLifetimeManager(),new InjectionFactory(container=>{throw new Exception();})); 团结。决心()//使用RegisterType InjectionFactory

C# Unity解决类向多个接口注册时的最后一次注册 公共接口A { } 公共接口B { } 公共接口C:A,B { } 公开课Foo:C { } IUnityContainer unity=新的UnityContainer(); RegisterType(new TransientLifetimeManager(),new InjectionFactory(container=>{throw new Exception();})); RegisterType(new TransientLifetimeManager(),new InjectionFactory(container=>{throw new Exception();})); 团结。决心()//使用RegisterType InjectionFactory,c#,dependency-injection,unity-container,C#,Dependency Injection,Unity Container,我希望Unity使用“A”InjectionFactory。Unity每个构建密钥只维护一个构建计划,因此第二次注册将覆盖第一次注册(对于Foo) 注册时,首先在a和Foo之间创建映射,然后根据构建键(type:Foo,Name:null)将任何注入成员应用于目标类型(Foo) 因此,A和Foo之间的映射与应用于Foo的注入成员是分开的 为了更清楚地说明注册的覆盖,我认为以下功能等同于您的配置: public interface A { } public interface B { } publ

我希望Unity使用“A”InjectionFactory。

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

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

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

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

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.RegisterType(新的TransientLifetimeManager(),
新注入工厂(容器=>{throw new Exception();}));
unity.RegisterType(新的TransientLifetimeManager(),
新注入工厂(容器=>{throw new Exception();}));
unity.RegisterType();

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

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

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

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

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

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.RegisterType(新的TransientLifetimeManager(),
新注入工厂(容器=>{throw new Exception();}));
unity.RegisterType(新的TransientLifetimeManager(),
新注入工厂(容器=>{throw new Exception();}));
unity.RegisterType();

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

很有趣,我认为这是一个bug,或者至少没有按预期工作。使用命名注册似乎可以解决这个问题,但这可能不是您想要的。有趣的是,我认为这是一个bug,或者至少没有按照预期工作。使用命名注册似乎可以解决问题,但这可能不是您想要的。