Unity 2.0: как создать дочерние контейнеры для инъекций CT или? - PullRequest
1 голос
/ 25 июня 2010

У меня есть класс MessageSender, его конструктор выглядит так:

    public MessageSender(IInputComponent input, IOutputComponent output)
    {
        m_Input = input;
        m_Output = output;
    }

Вот как я его создаю:

    Container.RegisterType<IMessageSender, MessageSender>();
    Container.RegisterType<IInputComponent, KeyboardInput>();
    Container.RegisterType<IOutputComponent, ScreenOutput>();
    Container.RegisterType<ILogger, Logger>();
    return Container.Resolve<IMessageSender>();

Вот обработчик KeyboardInput:

    public KeyboardInput(IUnityContainer container)
    {
        m_Container = container;
        m_Logger = container.Resolve<ILogger>();
    }

Я хочу, чтобы экземпляр KeyboardInput получал дочерний контейнер для своего конструктора, поэтому он разрешает свой регистратор из дочернего контейнера, а не из родительского.

Как мне это сделать?

Спасибо!

1 Ответ

3 голосов
/ 26 июня 2010

Вы не должны принимать зависимость от IUnityContainer в KeyboardInput или любом другом классе. Контейнер DI должен разрешить все компоненты и убраться с дороги - я называю это Голливудским принципом для DI . Сохранение ссылки на контейнер ведет к антишаблону Abstract Service Locator , так что это потрясающе плохая идея.

Эти последние посты Кшиштофа Козьмича объясняют это довольно хорошо:

Всегда возможно изменить дизайн объектной модели так, чтобы ссылаться на контейнер не было необходимости. Как вы думаете, зачем вам нужен контейнер в KeyboardInput?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...