Unityコンテナで2つのインターフェイスを操作しているときに、同じコンテナに登録されているような気がします。コード例が明確になります。Unity:2つのインターフェイスで同じタイプを登録する
私は以下のクラス階層があります。
public interface IBaseInterface
{
}
public interface IInterface1: IBaseInterface
{
}
public interface IInterface2: IBaseInterface
{
}
public class Interface1Impl : IInterface1
{
}
public class Interface2Impl : IInterface2
{
}
public class BaseInterfaceDecorator: IInterface1,IInterface2
{
private readonly IBaseInterface baseInterface;
public BaseInterfaceDecorator(IBaseInterface baseInterface)
{
this.baseInterface = baseInterface;
}
}
public class MyClass
{
private readonly IInterface1 interface1;
public MyClass(IInterface1 interface1)
{
this.interface1 = interface1;
}
}
をそして、これは登録コードです:
var container = new UnityContainer();
container.RegisterType<IInterface1, BaseInterfaceDecorator>(
new InjectionConstructor(
new ResolvedParameter<Interface1Impl>()));
container.RegisterType<IInterface2, BaseInterfaceDecorator>(
new InjectionConstructor(
new ResolvedParameter<Interface2Impl>()));
var dependency = container.Resolve<MyClass>();
私はInterface2Impl代わりのInterface1ImplとBaseInterfaceDecoratorを得ているのMyClassを解決する場合。私には不思議そうだ。説明できますか?
これは読者に明らかではありません。内部的にUnityは 'to'タイプのビルドキーをキャッシュします(例えば、ジェネリックシグネチャでは 'TTo')。次に 'TFrom'タイプを解決すると、 'TTo'のビルドキーがビルドアップを実行するために使用されます。このビルドキーは生涯のマネージャーにも関連付けられているので、UnityはTFToのアイデンティティに関係なく、TToのすべてのサブクエリの解決に最初に使用されたライフタイムマネージャー(ビルドアップ)を使用するように見えます。 これはUnityのビルドキー。この問題を回避するには、名前の付いた登録を使用します。これは、共変型IDの確立のポイントを打ち負かします。 –