2009-04-19 3 views
3

Я читал через Misko Hevery's Guide: Writing Testable Code.Кто несет ответственность за присоединение слушателей к схеме инъекций без инициализации?

Я определенно покупаю инъекцию зависимостей как отличный инструмент для повышения тестируемости и многого использую в своем коде. Однако, читая первую часть руководства «Flaw #1: Constructor does Real Work», я нахожу, что все еще немного нечетко о том, как вы предполагаете прослушивать прослушиватели событий.

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

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

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

+0

Какова продолжительность жизни объектов-слушателей? Они живут дольше, чем ваш основной объект? Если они имеют более короткий срок службы, чем основной объект, они не должны передаваться через конструктор. – Runcible

ответ

1

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

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

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

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

Misko's latest article on managing object lifetimes talks about this subject.

1

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

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

Смежные вопросы