Я вижу странное поведение в контейнере Unity при работе с двумя интерфейсами, которые оба регистрируются на одном и том же декораторе. Пример кода будет более понятным.Unity: Регистрация одного и того же типа для двух интерфейсов
у меня есть следующие иерархии классов:
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>();
При решении MyClass я получаю BaseInterfaceDecorator с Interface2Impl вместо Interface1Impl. Кажется странным для меня. Вы можете объяснить?
В случае, если это не понятно для читателей; Internal Unity кэширует ключ сборки типа «to» (например, «TTo» в общих подписях.) В следующий раз, когда вы разрешите любой тип «TFrom», Build Build для «TTo» используется для выполнения сборки. Этот ключ сборки также связан с менеджером по продолжительности жизни, и, таким образом, Unity, как представляется, использует первый использованный менеджер времени жизни (в Build Up) для всех подсекторных разрешений для TTo (независимо от личности TFrom.) Это ошибка с Unity's Строить ключи. Обходной путь заключается в использовании именных регистраций, которые побеждают точку в определении идентичности ковариантного типа. –