Unity: регистрация декоратора в дочернем контейнере - PullRequest
3 голосов
/ 10 апреля 2011

У меня есть следующий сценарий:

В базовом контейнере я регистрирую тип.

container.RegisterType<IFoo,Foo>();

В дочернем контейнере я хотел бы зарегистрировать Decorator, который переносит любыеБазовый контейнер использует.Поэтому, если у меня есть этот класс:

public class FooDecorator: IFoo
{
    public FooDecorator(IFoo foo) {}
}

Я хочу зарегистрироваться:

childContainer.RegisterType<IFoo,FooDecorator>();

Мне кажется разумным, что когда дочерний контейнер разрешает IFoo в конструкторе FooDecorator, он будетпопытаться разрешить IFoo родительского контейнера.Но это не так.Он пытается разрешить FooDecorator снова и, следовательно, снова и снова, пока не будет сгенерировано исключение StackOverflow.

Я знаю, что это можно решить, указав InjectionConstructor в регистрации дочернего контейнера, например:

childContainer.RegisterType<IFoo,FooDecorator>(
   new InjectionConstructor(new ResolvedParameter<Foo>()));

Но это кажется хрупким.Если кто-то хочет изменить фактический экземпляр IFoo в базовом контейнере с Foo на что-то другое, ему также придется изменить также все дочерние контейнеры.

Так что, я что-то упустил?Есть ли лучшее решение проблемы?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Вы можете использовать именованное отображение:

parentContainer.RegisterType<IFoo, Foo>("decorated");

childContainer.RegisterType<IFoo, FooDecorator>(
   new InjectionConstructor(new ResolvedParameter<IFoo>("decorated")));

Таким образом, регистрация декоратора зависит от именованного отображения, «украшенного» интерфейса IFoo.

1 голос
/ 11 сентября 2013

ответ onof требует возиться с параметрами конструктора, которые могут измениться во время разработки. Мой ответ в другом месте устраняет это, но в обмене имеет другие недостатки.

С моей техникой регистрация будет выглядеть следующим образом:

unityContainer.RegisterType<IService, LoggedService<ProfiledService<Service>>>();
...