Re: Инверсия управления | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Почитал тему - остался не отвеченным вопрос "в какой момент производится внедрение зависимости". В своей книге Крейг Уоллс считает, что внедрение происходит в момент - когда ссылка запоминается в поле:
Но, есть мнение, что "зависимости внедряются в(через) конструктор/сеттер". Каково твоё мнение? |
Re: Инверсия управления | |
---|---|
S-type Автор Сообщений: 2969 Дата регистрации: 24.04.2004 |
Скачал книгу "Внедрение зависимостей в .NET" Марка Симана. На странице 35:
Цитата: Т.е. автор этой книги прямо говорит, что наличие контейнера не обязательно для реализации паттерна внедрения зависимостей. Исправлено 1 раз(а). Последнее : S-type, 12.03.18 11:57 |
Re: Инверсия управления | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Как и для любого шаблона есть теория, и есть практика. На практике без контейнера получаем кучу геморроя, так что все плюсы "снижения зацепления" съедаются минусами мега-зацеплённого кода в той части где происходит создание объектов и передача их в конструкторы друг друга. И я таких решений лично не видел.
В части же теории, если выбирать между теми кто ТРЕБУЕТ наличия внешнего компонента внедрения зависимостей (assembler, injector, container - они по разному могут называться), и теми которые считают что "неважно кто и как производит внедрение, главное что есть конструктор с параметром" - я несомненно выберу первых. Т.к. это получится законченное решение - и гайка и болт. А у вторых - только гайка - бесполезная сама по себе, и потенциально приводящая к тому что в неё будут засовывать всё что угодно - от гвоздя до пальца, и хорошо если повезёт и таки болт применят Есть тупой вариант внедрения зависимости через public поле. Там нет сеттера, нет ВООБЩЕ никакого исполняемого кода (в самом классе куда происходит внедрение) - ну и где же тогда происходит "внедрение зависимости"? Я не склонен разделять процесс создания или поиска (т.к. зачастую "требуемый экземпляр" вовсе не создаётся на каждого "требователя" - бывает и синглтон стратегия lifetime management-а) внедряемого объекта, его передачи в конструктор/сеттер/метод, и того что внутри класса с полученной ссылкой будет сделано - да её запросто можно и "забыть" по выходу из блока кода, если ссылка нужна исключительно в коде конструктора, например. Опять же с точки зрения практики нужно что? Понимать как строить сами классы: - пользоваться интерфейсами - создать параметризованный конструктор или свойство для приёма ссылки (если надо, аннотировать это дело атрибутами) Понимать как настраивать DI контейнер: - как регистрировать конкретные реализации для обслуживания интерфейсов (через прямой код регистрации, или атрибутами) - как настраивать lifetime management - т.е. как в итоге будут порождаться экземпляры "реализаций" (одна на контейнер, или каждому запросившему своя, или ещё как-то более хитро) Понимать как использовать первое и второе в связке: - заменять new класс() на вызов соответствующего метода контейнера который сконструирует объект, внедрит в него зависимости и отдаст нам для работы Всё прочее - пустые слова a-la спор остроконечников с тупоконечниками ------------------ WBR, Igor |
© 2000-2024 Fox Club  |