Unity: регистрация одного типа для двух интерфейсов - PullRequest
6 голосов
/ 17 января 2011

Я вижу странное поведение в контейнере 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 ]

9 голосов
/ 19 января 2011

Похоже, что последняя инструкция внедрения для данного типа "to" выигрывает.Если вы возьмете копию Reflector и посмотрите на реализацию UnityContainer.RegisterType (Type, Type, string, LifetimeManager, InjectionMember []), вы поймете почему.

IMO, это поведение является ошибкой.По крайней мере, InjectedMembers.ConfigureInjectionFor (Type, string, InjectionMember []) должно генерировать исключение, а не молча заменять предыдущую конфигурацию внедрения.Тем не менее, это действительно должно поддерживать то, что вы пытаетесь.

2 голосов
/ 18 сентября 2011

Не знаю, поможет ли это.Скорее всего, сейчас уже слишком поздно.Но это достижимо, если вы используете именованную регистрацию, т. Е. Вы регистрируете каждый тип для разрешения с другим именем.

Например:

Container.RegisterType<IInterface1, BaseInterfaceDecorator>("interface1");
Container.RegisterType<IInterface2, BaseInterfaceDecorator>("interface2");
...