Где разместить необходимый код инициализации при использовании Dependency Injection? - PullRequest
0 голосов
/ 20 марта 2012

Когда мои конструкторы являются чистыми установщиками аргументов в пользу свойств, я не уверен, куда поместить другой код, необходимый классу для правильной работы.

Например, в JavaScript я программирую WindowMessageController, который обрабатывает message события на объекте window.

Чтобы это работало, я должен где-то прикрепить обработчик:

var controller = this;
this.applicableWindow.addEventListener("message", function(event) {
    controller.messageAction(event.data);
} 

Куда относится этот материал?

  1. в конструкторе
  2. в методе .initialize () - вводит временную связь
  3. в WindowMessageControllerFactory.create (applyWindow) - довольно отдаленное место для такого центрального фрагмента кода. Это означает, что даже такой маленький класс будет разбит на две части.
  4. в самом корне композиции - это увеличит его размер при выполнении все время
  5. в каком-то другом классе WindowMessageRouter, который будет иметь только один метод, конструктор, с этим кодом

EDIT

Этот случай кажется особенным, потому что в приложении обычно есть только один экземпляр такого контроллера. Однако в более обобщенном случае, что будет ответом, если я создаю экземпляры класса Button, которые будут обернуты над некоторым элементом DOM <button />? Внезапный

button = buttonFactory.create(domButtonEl);

кажется гораздо более полезным.

Ответы [ 3 ]

2 голосов
/ 23 марта 2012
  1. Не вкладывайте никаких реальных работ в конструкторы. Конструкторы вряд ли издеваются. Помните, швы ака методы являются насмешливыми. Конструктор не является насмешливым, потому что наследование и насмешка.

  2. Инициализация - это запрещенное слово для большинства общих слов.

  3. Может быть, но вы можете реализовать фабрику как статический метод класса, если вы боитесь многих классов)

  4. Композиция root - просто обычная фабрика. За исключением того, что это только один, потому что ваше приложение, вероятно, имеет только одну точку входа,

  5. Общее, мы используем Javascript. Если вам нужен только один фабричный метод, зачем вам класс? Помните, что функции являются объектами первого класса.

И для редактирования. В одиночках нет ничего особенного, если только они НЕ контролируют свой жизненный цикл.

Золотое правило: всегда (почти) делайте разделение между проводкой приложения и логикой приложения. Заводы электромонтажные. Просто проводка, без логики, поэтому проверять нечего.

1 голос
/ 20 марта 2012

Я бы поместил этот код в initialize (window) метод, но этот метод не может быть частью WindowMessageController открытого API - он должен быть видимым и вызываться directтолько для пользователей (поэтому составьте root и тесты).Поэтому, когда DI-контейнер возвращает WindowMessageController экземпляр, тогда контейнер отвечает за то, что был вызван initialize метод.

Ответ на редактирование: Да, эта фабрика кажетсялучший способ для меня.Btw.не забывайте, что фабрика, вероятно, должна иметь метод dispose (т.е. отменяет привязку обработчика события в случае button ) ...

0 голосов
/ 22 марта 2012

Я думаю, вам нужно создать класс Router , который будет отвечать за распространение событий.Этот Маршрутизатор должен подписаться на все события и распределить их среди контроллеров.Он может использовать какую-то карту контроллера сообщений, вставленную в конструктор.

...