Внедрение зависимостей в .NET

в 7:53, , рубрики: .net, Блог компании Издательский дом «Питер», издательский дом, Программирование, метки: , ,

Внедрение зависимостей в .NET
Название оригинала: Dependency Injection in .NET
Автор: Марк Симан
Дата выхода: август 2013г.

В конце лета у нас выходит новая переводная книга «Dependency Injection in .NET» издательства Manning Publications. Хотим вашему внимаю представить перевод небольшого анонса.

Dependency Injection in .NET — это великолепное описание технологии внедрения зависимостей (DI), связанных с ней паттернов и нескольких важнейших фреймворков для такого внедрения. Симан проработал множество ресурсов (книг, журнальных статей, записей в блогах) и создал свой всеобъемлющий труд. Несомненно, автор опирается на массу самостоятельно проведенных исследований и собственный практический опыт в работе с внедрением зависимостей.

Эта книга попала мне в руки весьма кстати. Пару месяцев назад я начал работать над WPF-проектом, использующим Prism. Один мой коллега, с которым мы ранее работали вместе, очень порекомендовал мне эту книгу, вот я и приобрел экземпляр. (Дело в том, что я как раз «книгочей», по книгам мне проще всего учиться. Другие люди учатся иначе, но этот обзор написан именно с точки зрения книгочея).

Часть 1

Часть 1 — это обзор технологии внедрения зависимостей. Симан рассказывает, чем являются такие операции (называемые «инъекциями»), а также развенчивает некоторые заблуждения, связанные с ними. Автор рассказывает о достоинствах внедрения зависимостей, в частности о позднем связывании, расширяемости, параллельной разработке, поддержке и тестируемости кода. Автор также закладывает основы практического применения зависимостей, демонстрируя хорошие и плохие примеры реализации внедрения зависимостей и указывая, как каждый такой вариант влияет на достижение поставленных целей. Наконец, он делает введение в другие темы, которые будут рассматриваться в книге, и в частности упоминает паттерны проектирования, функциональные возможности внедрения зависимостей, а также имеющиеся в наличии контейнеры для внедрения зависимостей.

Часть 2

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

К антипаттернам относятся Диктатор, Гибридная инъекция, Ограниченная конструкция и Локатор сервисов. Тот факт, что автор причисляет Локатор сервисов к антипаттернам, является наиболее спорным. Большинство специалистов считают Локатор сервисов вполне допустимым паттерном внедрения зависимостей (а не антипаттерном). Сам Симан признает, что в течение многих лет выступал в защиту Локатора сервисов, но в итоге пришел к выводу, что недостатки Локатора сервисов перевешивают его достоинства. В проект Prism (это шаблон для создания составных приложений Microsoft) встроен Локатор сервисов. Сейчас я работаю в команде, использующей Prism. Мы то и дело задействуем Локатор сервисов, и я не понаслышке знаю о его достоинствах и недостатках. На данном этапе могу сказать, что достоинства перевешивают, и я готов работать с этим паттерном и дальше, несмотря на некоторые недостатки.

В части 2 также есть глава о рефакторинге Инъекций зависимостей. Это очень дельный обзор того, с какими ситуациями, предполагающими внедрение зависимостей, вы можете столкнуться на практике. Например, рассмотрено обращение с циклическими и кратковременными зависимостями. Это действительно очень важные темы. Поскольку те контейнеры внедрения зависимостей, с которыми обычно приходится работать, добавляют дополнительный уровень абстрагирования, мы иногда забываем о потенциальных проблемах (полагая, что контейнер справится с ними сам).

Часть 3

В части 3 рассмотрены еще некоторые крупные темы, связанные с внедрением зависимостей: композиция объектов, длительность жизни объектов и перехват. Композиция объектов определяет, как именно внедрение зависимостей применяется при создании объектов. Симан демонстрирует различные примеры создания объектов – от простых реализаций в консоли и WPF-приложений до довольно сложных вариантов, связанных с применением ASP.NET и пусковых команд (командлетов) PowerShell.

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

Наконец, Симан рассматривает проблему перехвата. Эта идея заключается в использовании контейнера для внедрения зависимостей с целью реализации в приложении сквозных функций. Например, можно запрограммировать каждую из зависимостей в контейнере на внедрение функции логирования или на обработку ошибок. Это очень интересная тема. Автор также затрагивает аспектно-ориентированное программирование (AOP) и сравнивает его с внедрением зависимостей на примерах с решением одних и тех же задач.

Часть 4

В части 4 рассмотрено несколько контейнеров для внедрения зависимостей. В этой части мне особенно понравилось, что во всех главах Симан последовательно использует одни и те же примеры. Таким образом он сосредотачивается не на самом примере, а на различиях реализации конкретных контейнеров.

Заключение

Книга «Внедрение зависимостей в .NET» — замечательное практическое пособие. На рынке не так много книг, посвященных этой теме, поэтому тем более приятно изучить столь качественный труд. Рекомендую эту книгу всем разработчикам, желающим в совершенстве освоить применение технологии внедрения зависимостей.

Автор: ph_piter

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js