:: Не фоксом единым
Re: Инверсия управления
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Почитал тему - остался не отвеченным вопрос "в какой момент производится внедрение зависимости". В своей книге Крейг Уоллс считает, что внедрение происходит в момент - когда ссылка запоминается в поле:

public BraveKnight(Quest quest) {
this.quest = quest; // Внедрение сценария подвига
}

Но, есть мнение, что "зависимости внедряются в(через) конструктор/сеттер".

Каково твоё мнение?
Ratings: 0 negative/0 positive
Re: Инверсия управления
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Скачал книгу "Внедрение зависимостей в .NET" Марка Симана. На странице 35:

Цитата:
Контейнер ВЗ (внедрение зависимостей) — это опциональная библиотека, которая может облегчить нам сборку компонентов при компоновке приложения, но это не тот путь, который нам нужен. Когда мы реализуем приложения без контейнера ВЗ (я называю такой вариант «ВЗ для бедных»), над ними приходится поработать немного больше, но никаким отказом от принципов внедрения зависимостей это не является.
Если вы полагаете, что ВЗ обязательно требует наличия контейнера ВЗ, то знайте: это не так. ВЗ представляет собой набор принципов и шаблонов, при этом контейнер ВЗ является полезным, но не необходимым инструментом.

Т.е. автор этой книги прямо говорит, что наличие контейнера не обязательно для реализации паттерна внедрения зависимостей.



Исправлено 1 раз(а). Последнее : S-type, 12.03.18 11:57
Ratings: 0 negative/0 positive
Re: Инверсия управления
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Как и для любого шаблона есть теория, и есть практика. На практике без контейнера получаем кучу геморроя, так что все плюсы "снижения зацепления" съедаются минусами мега-зацеплённого кода в той части где происходит создание объектов и передача их в конструкторы друг друга. И я таких решений лично не видел.

В части же теории, если выбирать между теми кто ТРЕБУЕТ наличия внешнего компонента внедрения зависимостей (assembler, injector, container - они по разному могут называться), и теми которые считают что "неважно кто и как производит внедрение, главное что есть конструктор с параметром" - я несомненно выберу первых. Т.к. это получится законченное решение - и гайка и болт. А у вторых - только гайка - бесполезная сама по себе, и потенциально приводящая к тому что в неё будут засовывать всё что угодно - от гвоздя до пальца, и хорошо если повезёт и таки болт применят

S-type
Но, есть мнение, что "зависимости внедряются в(через) конструктор/сеттер".
Каково твоё мнение?
Есть тупой вариант внедрения зависимости через public поле. Там нет сеттера, нет ВООБЩЕ никакого исполняемого кода (в самом классе куда происходит внедрение) - ну и где же тогда происходит "внедрение зависимости"?
Я не склонен разделять процесс создания или поиска (т.к. зачастую "требуемый экземпляр" вовсе не создаётся на каждого "требователя" - бывает и синглтон стратегия lifetime management-а) внедряемого объекта, его передачи в конструктор/сеттер/метод, и того что внутри класса с полученной ссылкой будет сделано - да её запросто можно и "забыть" по выходу из блока кода, если ссылка нужна исключительно в коде конструктора, например.

Опять же с точки зрения практики нужно что?
Понимать как строить сами классы:
- пользоваться интерфейсами
- создать параметризованный конструктор или свойство для приёма ссылки (если надо, аннотировать это дело атрибутами)
Понимать как настраивать DI контейнер:
- как регистрировать конкретные реализации для обслуживания интерфейсов (через прямой код регистрации, или атрибутами)
- как настраивать lifetime management - т.е. как в итоге будут порождаться экземпляры "реализаций" (одна на контейнер, или каждому запросившему своя, или ещё как-то более хитро)
Понимать как использовать первое и второе в связке:
- заменять new класс() на вызов соответствующего метода контейнера который сконструирует объект, внедрит в него зависимости и отдаст нам для работы

Всё прочее - пустые слова a-la спор остроконечников с тупоконечниками


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 9 (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика