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. Мне это кажется странным. Вы можете объяснить?
2 ответов
похоже, что последняя инструкция инъекции для данного типа "to" выигрывает. Если вы захватите копию отражатель и взгляните на UnityContainer.Registertype (тип, тип, строка, LifetimeManager, InjectionMember[]) реализация, вы увидите, почему.
IMO, это поведение является ошибкой. По крайней мере, InjectedMembers.ConfigureInjectionFor (Type, string, InjectionMember []) должен выдавать исключение вместо молчаливой замены предыдущей инъекции конфигурация. Тем не менее, он действительно должен поддерживать то, что вы пытаетесь.
Я не знаю, помогает ли это. Скорее всего, для тебя уже слишком поздно. Но это достижимо, если вы используете именованную регистрацию, т. е. регистрируете каждый тип для разрешения с другим именем.
например:
Container.RegisterType<IInterface1, BaseInterfaceDecorator>("interface1");
Container.RegisterType<IInterface2, BaseInterfaceDecorator>("interface2");
