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 はビルド キーごとに 1 つのビルド プランのみを維持するため、2 番目の登録は最初の登録を上書きします (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 に答える