Кто отвечает за подключение слушателей в схеме внедрения зависимостей без инициализации? - PullRequest
3 голосов
/ 19 апреля 2009

Я читал руководство Миско Хевери : написание тестируемого кода .

Я определенно покупаю инъекцию зависимостей как отличный инструмент для улучшения тестируемости и часто использую его в своем коде. Однако, читая первую часть руководства " Недостаток # 1: Конструктор выполняет реальную работу ", я обнаружил, что все еще немного неясен относительно того, как вы должны подключать прослушиватели событий.

Допустим, у меня есть класс, которому для правильной работы необходимо подключить слушатель к одному из аргументов, передаваемых через внедрение зависимостей в конструктор. Согласно руководству, конструктор должен только назначать свои аргументы переменным-членам и не выполнять никакой другой работы. Кроме того, объект должен быть полностью инициализирован после завершения конструктора. Однако в этом случае я бы не считал объект полностью инициализированным, если не требуется, чтобы прослушиватели были подключены.

Насколько я могу судить, это требует подключения всех слушателей в сборщике или фабрике, хотя это, кажется, очень отделено от самого объекта и легко не синхронизировано. Кроме того (по крайней мере, в ActionScript, который я трачу большую часть своего времени в эти дни), это означало бы, что мои слушатели событий больше не могли быть частными, так как фабрика / строитель должны были бы их видеть.

Какой лучший способ справиться с этим? Есть ли другой вариант, который я здесь упускаю?

Ответы [ 2 ]

1 голос
/ 05 мая 2009

Обычный шаблон заключается в том, чтобы переместить проводку в метод initialize () или start () и воспользоваться механизмом жизненного цикла контейнера внедрения зависимостей, чтобы обеспечить вызов метода.

В моем текущем проекте мы объединяем аннотации с постпроцессорами bean-компонентов Spring и Spring.NET, чтобы подключить прослушиватели событий к методам.

1 голос
/ 04 мая 2009

Отделить бизнес-логику (граф вызовов) от создания объекта

В частности: если для House требуется инициализированный Kitchen для правильной работы, инициализированный Kitchen должен быть передан в конструктор House.

House не должен отвечать за инициализацию Kitchen. Это чужая ответственность. (Вероятно, тот, кто построил Кухню в первую очередь.)

Однако есть небольшая ошибка: если объект имеет более короткое время жизни, чем House, он не принадлежит как переменная-член. Например: Person или Owner, вероятно, не следует передавать через конструктор. Он должен быть передан через вызовы функций.

В последней статье Миско об управлении временем жизни объектов обсуждается эта тема.

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