Widzę dziwne zachowanie w kontenerze Unity, gdy pracuję z dwoma interfejsami, które rejestrują się w tym samym dekoratorze. Przykład kodu będzie wyraźniejszy.Unity: Rejestracja tego samego typu dla dwóch interfejsów
Mam następujące klasy Hierarchia:
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;
}
}
I to jest kod rejestracyjny:
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>();
Podczas rozwiązywania MojaKlasa Dostaję BaseInterfaceDecorator z Interface2Impl zamiast Interface1Impl. Wydaje mi się to dziwne. Możesz wytłumaczyć?
W przypadku, gdy nie jest jasne dla czytelników; Wewnętrznie Unity buforuje klucz budowania typu "do" (np. "TTo" w ogólnych sygnaturach). Przy następnym rozwiązaniu dowolnego typu "TFrom" klucz kompilacji dla "TTo" jest używany do wykonania kompilacji. Ten klucz budowania jest również powiązany z menedżerem na całe życie i dlatego Unity wydaje się używać pierwszego używanego menedżera na całe życie (w Build Up) dla wszystkich zastępczych rozstrzygnięć dla TTo (niezależnie od tożsamości TFrom). To jest błąd z Unity's Buduj klucze. Rozwiązaniem jest użycie nazwanych rejestracji, które pokonują punkt w tworzeniu tożsamości kowariancyjnych. –