Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Парадигма внедрения зависимостей (DI) в течение минувшего десятилетия де-факто стала одной из доминирующих на платформе .NET и теперь обязательна к изучению для всех .NET-разработчиков. Это переработанное и дополненное издание классической книги «Внедрение зависимостей в .NET». Вы научитесь правильно внедрять зависимости для устранения жесткой связи между компонентами приложения. Познакомитесь с подробными примерами и усвоите основы работы с ключевыми библиотеками, необходимыми для внедрения зависимостей в .NET и .NET Core. В книге: •Рефакторинг существующего кода в слабо связанный код •Методы DI, которые работают со статически типизированными ОО языками •Интеграция с общими платформами .NET Framework •Обновленные примеры, иллюстрирующие DI в .NET Core
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 697
Veröffentlichungsjahr: 2024
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Научный редактор М. Сагалович
Переводчик Н. Вильчинский
Технический редактор Н. Рощина
Литературные редакторы Н. Рощина, А. Тазеева
Художники Н. Гринчик, В. Мостипан, Г. Синякина (Маклакова)
Корректоры О. Андриевич, Н. Гринчик, Е. Павлович
Верстка Г. Блинов
Марк Симан, Стивен ван Дерсен
Внедрение зависимостей на платформе .NET. 2-е издание. — СПб.: Питер, 2021.
ISBN 978-5-4461-1166-4
© ООО Издательство "Питер", 2021
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
С компанией Microsoft связан особый феномен эхокамеры. Microsoft — очень крупная организация, окруженная системой сертифицированных партнеров, увеличивающей ее размер на несколько порядков. Возможно, тем, кто встроен в эту систему, трудно оценить ее границы. Вполне вероятно, что при поиске решения проблемы, связанной с продукцией или технологией Microsoft, найдется ответ, предполагающий использование еще большего количества продуктов Microsoft. Неважно, что именно вы прокричите в эхокамере, ответ будет один — Microsoft!
К моменту моего поступления на работу в Microsoft в 2003 году я уже прочно был встроен в эту систему, проработав несколько лет на сертифицированных партнеров Microsoft, и это мне понравилось! Вскоре меня отправили на внутреннюю техническую конференцию в Новом Орлеане для изучения самых передовых технологий компании.
Сегодня я уже и не вспомню, что было на тех занятиях по продуктам Microsoft, которые я посещал, но последний день все же в памяти остался. В тот день, осознав, что никакие занятия не смогут утолить жажду сведений о новых технологиях, я думал в основном о том, как прилечу обратно в Данию. Поэтому хотел выбрать такое место, где можно было бы просмотреть электронную почту. Я пришел на занятие, которое посчитал не представлявшим для меня особого интереса, и включил ноутбук.
План занятия не был четко расписан и состоял из выступления нескольких докладчиков. Одним из них был бородатый парень по имени Мартин Фаулер (Martin Fowler), рассказывающий о разработке на основе тестирования (Test-Driven Development, TDD) и динамических имитациях, или мок-объектах. Об этом парне я никогда не слышал и к его речи особо не прислушивался, но кое-что из сказанного в моем сознании все же отложилось.
Вскоре после возвращения в Данию я получил задание переписать с нуля большую ETL-систему (ETL означает «извлечение, преобразование, загрузка» — extract, transform, load) и решил попробовать TDD (оказалось, совсем не зря). Все это потребовало применения динамических имитаций, а кроме того, мне нужно было управлять зависимостями. Я понял, что это довольно непростая, но захватывающая задача, и постоянно думал над ее решением.
То, что сначала было побочным эффектом интереса к TDD, стало истинной страстью. Я провел множество исследований, изучил массу интернет-публикаций на эту тему, сам написал несколько статей, экспериментировал с кодом и обсуждал этот вопрос со всеми, кто был готов меня выслушать. Все чаще мне приходилось искать вдохновение и рекомендации вне эхокамеры Microsoft. Меня даже стали связывать с движением ALT.NET, хотя я никогда не проявлял особой активности в этом направлении. Я делал массу всевозможных ошибок, но постепенно у меня сложилось целостное понимание внедрения зависимостей — Dependency Injection (DI).
Когда представители издательства Manning обратились ко мне с предложением написать книгу о внедрении зависимостей в .NET, моей первой реакцией было: «А нужно ли это?» Я чувствовал, что все концепции, которые требуются разработчику для понимания DI, уже описаны в многочисленных публикациях в блогах. Можно ли к этому что-то добавить? Честно говоря, я думал, что DI в .NET была уже весьма заезженной темой.
Но, поразмыслив, я все же понял, что, хотя сведений множество, они сильно разбросаны по разным источникам, в которых слишком много разночтений. До первого издания этой книги не было публикаций, посвященных DI, в которых была бы предпринята попытка дать целостное описание данной технологии. Подумав еще, я пришел к выводу, что Manning предлагает мне решить весьма непростую задачу и дает прекрасную возможность собрать и систематизировать все, что я знал о DI.
В результате появились эта книга и предшествующее ей первое издание. Для представления и описания обширной терминологии и методологической основы внедрения зависимостей в книге используются среда .NET Core и язык C#, но я надеюсь, что ценность издания выйдет далеко за рамки платформы. Я думаю, что сформулированный здесь язык паттернов носит универсальный характер. Кем бы вы ни были, разработчиком в среде .NET или пользователем другой объектно-ориентированной платформы, я надеюсь, что эта книга поможет вам существенно повысить свою квалификацию разработчика программных продуктов.
Можно посчитать благодарности своеобразным клише, но человеческую природу не переделаешь. В процессе написания книги возникало множество поводов поблагодарить других людей, и всем им хотелось бы сказать спасибо.
Начнем с того, что на работу над книгой уходило все наше свободное время и мы почувствовали, насколько обременительным проект был для наших жен. Жена Марка Сесилия постоянно находилась рядом с ним, и он ощущал ее активную поддержку на протяжении всего процесса. Самое главное, что она понимала, насколько важен для мужа этот проект. Они так и идут по жизни рука об руку, и Марк старается выкраивать побольше времени на общение с ней и с их детьми Линой и Ярлом. Жена Стива Джудит создала ему все условия, необходимые для завершения этого грандиозного начинания, и очень обрадовалась, когда все закончилось.
На более профессиональном уровне хочется поблагодарить издательство Manning, предоставившее нам такую возможность. Инициатор проекта — Майкл Стивенс (Michael Stephens). Ведущими редакторами, зорко следившими за качеством текста, были Дэн Махарри (Dan Maharry), Марина Майклс (Marina Michaels) и Кристина Тейлор (Christina Taylor). Они помогали нам, выискивая слабые места в исходном тексте, подвергая его конструктивной критике.
В роли ведущего технического редактора выступала Карстен Стробек (Karsten Strøbæk), она вычитывала массу чернового материала и давала ценные отзывы. Карстен участвовала в выпуске Марком первого издания, выступая в роли технического корректора. В нынешнем издании техническим корректором был Крис Хенеган (Chris Heneghan), исправивший много закравшихся в исходный текст досадных ошибок и опечаток.
После того как текст был готов, начался технологический процесс. Им управлял Энтони Калькара (Anthony Calcara). В роли редактора на этой стадии выступал Фрэнсис Буран (Frances Buran), а Николь Биад (Nichole Beard) следил за качеством графического оформления книги и представленных в ней схем.
Далее хочется упомянуть различных специалистов, читавших исходный текст на разных этапах его разработки, которым мы благодарны за комментарии и замечания. Это Аджай Бхосале (Ajay Bhosale), Бьорн Нордблом (Bjo..rn Nordblom), Джемре Менгу (Cemre Mengu), Деннис Селлингер (Dennis Sellinger), Эмануэле Ориджи (Emanuele Origgi), Эрнесто Карденас Кангауала (Ernesto Cardenas Cangahuala), Густаво Гомес (Gustavo Gomes), Игорь Кочетов (Igor Kochetov), Джереми Кейни (Jeremy Caney), Джастин Коулстон (Justin Coulston), Миккель Арентофт (Mikkel Arentoft), Паскуале Зирполи (Pasquale Zirpoli), Роберт Моррисон (Robert Morrison), Серджио Ромеро (Sergio Romero), Шон Лэм (Shawn Lam) и Стивен Бирн (Stephen Byrne), Иван Мартинович (Ivan Martinovic).
Мы получали отзывы и от многих участников проводимой издательством Manning программы раннего доступа — Manning Early Access Program (MEAP), которые задавали нам различные вопросы, помогавшие выискивать в тексте книги слабые места.
Особую благодарность мы выражаем Джереми Кейни (Jeremy Caney), который сначала был участником программы MEAP, но затем вошел в число научных редакторов. От него поступило громадное количество отзывов, касающихся как изложения, так и смыслового наполнения текста. Глубоко понимая технологию DI и методы разработки программных продуктов, он оказал нам бесценную помощь.
Особой благодарности заслуживает и Рик Слаппендель (Ric Slappendel). Рик подсказал нам, как с использованием DI создаются UWP-приложения. Его знание WPF, UWP и XAML сэкономило нам уйму времени и бессонных ночей и позволило полностью составить раздел 7.2 и сопровождающие его примеры кода. Без помощи Рика в книгу, наверное, так и не вошли бы страницы, где рассматривается UWP.
Мы также благодарны за участие в работе над книгой Алексу Мейер-Гливсу (Alex Meyer-Gleaves) и Тревису Иллигу (Travis Illig), которые просмотрели ранние версии главы 13 и дали отзывы об использовании новой конфигурации Autofac и поддержке паттерна «Декоратор».
И наконец, спасибо Могенс Хеллер Грэб (Mogens Heller Grabe), любезно позволившей нам воспользоваться изображением ее фена, включенного в розетку.
Книга главным образом посвящена внедрению зависимостей — Dependency Injection (DI). Она повествует и о среде .NET, но ей здесь отводится гораздо более скромная роль. Хотя во всех примерах используется код на языке C#, основную часть обсуждаемых в книге методов можно с легкостью реализовать и на других языках и платформах. Фактически мы почерпнули множество базовых принципов и паттернов при изучении книг, где в качестве примеров приводился код на языках Java или C++.
Технология внедрения зависимостей представляет собой набор взаимосвязанных паттернов и принципов. Это, скорее всего, не конкретная технология, а образ мышления, связанный с разработкой кода. Конечной целью использования технологии DI является обеспечение легкого в сопровождении программного продукта под эгидой парадигмы объектно-ориентированного программирования (ООП).
Все понятия, приводимые в книге, относятся к объектно-ориентированному программированию. Задача, решаемая за счет технологии DI (простота сопровождения кода), универсальна, но предлагаемое решение дается в рамках объектно-ориентированного программирования на статически типизированных языках C#, Java, Visual Basic .NET, C++ и т.д. Вы не сможете применить DI к процедурному программированию, и эта технология вряд ли станет разумным решением на функциональных или динамических языках программирования.
Если рассматривать технологию DI отвлеченно от всего остального, то ее масштабы невелики, но в действительности она тесно переплетена с целым комплексом принципов и паттернов, используемых при объектно-ориентированном проектировании программных продуктов. Несмотря на то что книга от начала до конца сконцентрирована на технологии DI, в ней в свете тех перспектив, которые раскрываются благодаря использованию DI, рассматриваются многие из сопутствующих тем. Цель книги — не просто довести до вас специфику применения технологии DI, но и поднять вашу квалификацию разработчика объектно-ориентированных программных средств на более высокий уровень.
Хотелось бы сказать, что книга предназначена для всех разработчиков, использующих среду .NET. Но в наши дни .NET-сообщество объединяет под своими знаменами широкий круг разработчиков веб-приложений, программ для настольных компьютеров, смартфонов, специалистов по созданию полнофункциональных интернет-приложений, сопряженных информационных систем, автоматизации делопроизводства, систем управления контентом и даже создателей компьютерных игр. Хотя среда .NET имеет объектно-ориентированный характер, объектно-ориентированным кодом занимаются не все разработчики.
Эта книга об ООП, и читатели как минимум должны быть заинтересованы в объектном ориентировании и понимать, что представляют собой интерфейсы. Конечно, неплохо, чтобы у них за плечами были хотя бы несколько лет профессиональной деятельности, а также знание паттернов проектирования или SOLID-принципов. Мы не думаем, что начинающие могут почерпнуть здесь что-то полезное для себя, поскольку книга предназначена главным образом для опытных разработчиков и проектировщиков программных средств.
Все примеры написаны на языке C#, следовательно, читатели, работающие с другими языками, использующимися в среде .NET, должны разбираться и в коде на C#. Книга может быть полезной и для читателей, знакомых с объектно-ориентированными языками, не применяющимися в среде .NET, поскольку материал, имеющий конкретное отношение к .NET-платформе, имеет довольно небольшой объем. Мы сами изучили множество книг о паттернах с примерами на Java, откуда неизменно черпали немало информации, поэтому надеемся, что верным будет и обратное утверждение.
Содержимое книги разбито на четыре части. В идеале хотелось бы, чтобы сначала вы прочитали ее от корки до корки, после чего использовали в качестве справочного пособия, но мы готовы к тому, что у вас другие приоритеты. Поэтому основная часть всех глав написана таким образом, чтобы можно было сразу же погрузиться в чтение той или иной главы и приступить к изучению книги с выбранного места.
Основным исключением из этого является часть I. В ней содержится общее введение в технологию DI, которое лучше всего изучить последовательно. Часть II представлена каталогом паттернов и им подобных сведений, а вот в части III, самой большой, технология DI исследуется с трех различных позиций. Часть IV книги содержит каталог из трех библиотек DI-контейнеров.
Итак, часть I представляет собой общее введение в технологию внедрения зависимостей. Если вы не знакомы с DI, то чтение нужно начинать именно с этого места, а если она вам уже известна, то ознакомление с содержимым этой части книги все равно пойдет вам на пользу, так как в ней вводится множество общих положений и терминов, используемых в остальных частях книги. В главе 1 дается общее представление о технологии DI, а также рассматриваются цели ее применения и преимущества, получаемые от этого. В главе 2 приводится пространный и развернутый пример кода с сильной связанностью, а в главе 3 объясняется, как тот же самый пример можно реализовать с помощью технологии DI. В отличие от других частей книги главы части I лучше читать последовательно, причем с самого начала.
Часть II представляет собой каталог паттернов, антипаттернов и примеров проблемного кода. Именно здесь можно найти рекомендации по способам реализации DI и предупреждение об опасностях, которых следует остерегаться. В главе 4 представлен каталог паттернов проектирования DI, а в главе 5 — каталог антипаттернов проектирования. В главе 6 рассматриваются обобщенные решения наиболее часто возникающих проблем. Поскольку все главы имеют вид каталога, в каждой из них содержится набор практически не связанных друг с другом разделов, предназначенных как для последовательного, так и для раздельного чтения.
В части III технология DI представлена с трех разных ракурсов: компоновки объектов (Object Composition), управления временем жизни (Lifetime Management) и перехвата (Interception). В главе 7 рассматриваются способы реализации DI в качестве надстройки над существующими средами выполнения приложений — ASP.NET Core и UWP, а также при использовании консольного приложения. В главе 8 речь идет о способах управления временем жизни зависимостей, позволяющих не допустить утечки ресурсов. Хотя структура этой главы менее строгая, чем предыдущих глав, ее основная часть может служить каталогом широко известных жизненных циклов зависимостей. Остальные три главы содержат описание способов компоновки приложений со сквозной функциональностью. В главе 9 раскрываются основы перехвата с применением декораторов, а в главах 10 и 11 углубленно анализируются понятия аспектно-ориентированного программирования. Именно здесь мы пожинаем плоды предшествующей работы, поэтому во многих отношениях считаем это место кульминационным моментом всей книги.
Часть IV представляет собой каталог библиотек DI-контейнеров. Она начинается с выяснения в главе 12 того, что представляют собой DI-контейнеры и как они вписываются в общую картину. В каждой из остальных трех глав весьма подробно рассматривается конкретный контейнер: Autofac, Simple Injector и Microsoft.Extensions.DependencyInjection. Для экономии места описание контейнеров в этих главах дается в довольно сжатой форме, и вы можете проявить интерес только к одному или двум наиболее подходящим контейнерам. По многим признакам эти три главы могут рассматриваться как весьма большой набор приложений.
Чтобы не рассматривать относящиеся к технологии DI принципы и паттерны в контексте конкретных API контейнеров, основной материал книги, исключая часть IV, не содержит ссылок на конкретный контейнер. Именно поэтому контейнерам отведена часть IV. Мы надеемся, что обобщенный характер раскрытия темы этой книги позволит ей оставаться актуальной как можно дольше.
Понятия, раскрываемые в первых трех частях, применимы и к тем библиотекам контейнеров, описание которых не вошло в часть IV. Есть неплохие контейнеры, находящиеся в свободном доступе, которые, к сожалению, мы не смогли рассмотреть. Но все же надеемся, что в книге есть множество полезного материала, который можно предложить для изучения пользователям тех библиотек, которыми поддерживаются эти контейнеры.
В этой книге приводится множество примеров кода. Основная его часть на C#, но в разных местах есть небольшое количество на XML и JSON. Исходный код в листингах и тексте оформляется моноширинным шрифтом, чтобы отделить его от обычного текста.
Весь исходный код для этой книги написан на C# в среде Visual Studio 2017. Приложения ASP.NET Core написаны на версии ASP.NET Core v2.1.
Лишь немногие из технических приемов, рассматриваемых в этой книге, зависят от современных особенностей языка. Мы стремились выдерживать разумный баланс между консервативными и современными стилями программирования. Когда мы пишем код для работы, мы гораздо чаще используем современные особенности языка, но здесь по большей части самыми новыми возможностями являются обобщения и LINQ-запросы. Нам ни в коем случае не хотелось бы навести вас на мысль, что технология внедрения зависимостей может применяться только при использовании самых современных языков.
Написание примеров кода для книги сопряжено со специфическими трудностями. По сравнению с монитором современного компьютера в книге можно разместить лишь очень короткие строки кода. Очень хотелось написать код в лаконичном стиле с короткими, но малопонятными именами методов и переменных. Такой код почти не похож на настоящий и понятный, даже если под рукой IDE-среда и отладчик, а в книге уловить в нем какой-либо смысл практически невозможно. По нашему мнению, использование как можно более легких для прочтения имен играет очень важную роль. Чтобы все поместилось на странице, иногда приходилось прибегать к необычным разрывам строк. Весь представленный код должен пройти компиляцию, но порой имеет немного необычный вид.
В коде применяется ключевое слово var из языка C#. В нашем профессиональном коде, где строку не нужно вписывать в ширину книжной страницы, зачастую используется иной стиль программирования, без var. Здесь для экономии места в тех случаях, когда мы считаем, что явное объявление затрудняет чтение кода, используем ключевое слово var.
В качестве синонима для слова «тип» в книге часто применяется слово «класс». В среде .NET классы, структуры, интерфейсы, перечисления и т.п. по своей сути являются типами, но поскольку слово «тип» в обычном языке имеет слишком много разнообразных значений, его использование зачастую затрудняет понимание текста.
Основная часть приведенных в книге примеров кода относится к общему для всей книги примеру интернет-магазина с внутренними вспомогательными управляющими приложениями. Возможно, это не самый впечатляющий пример из встречавшихся в книгах по программированию, но он был выбран по нескольким причинам.
• Большинству читателей эта предметная область хорошо понятна. Возможно, она кому-то покажется скучной, но зато не станет отвлекать от освоения технологии DI.
• Признаться, мы так и не нашли более подходящей предметной области, достаточно разнообразной по своему содержанию, куда бы вписывались всевозможные сценарии, намеченные нами к рассмотрению в книге.
В качестве примеров мы создали довольно большой объем кода, основная часть которого не вошла в книгу. Фактически почти весь он был написан с прицелом на использование принципа разработки на основе тестирования — Test-Driven Development (TDD), но поскольку книга посвящена не TDD, модульные тесты в ней обычно не приводились.
Исходный код всех примеров из этой книги можно скачать на веб-сайте издательства Manning: www.manning.com/books/dependency-injection-principles-practices-patterns. Так же смотрите репозиторий авторов книги: https://github.com/DependencyInjection-2nd-edition/codesamples. Инструкции по компиляции и запуску кода находятся в файле README.md в корневом каталоге пакета для скачивания.
Стивен ван Дерсен (Steven van Deursen) — фрилансер из Нидерландов, занимающийся разработками и проектированием в среде .NET и получивший богатый опыт работы в этой сфере начиная с 2002 года. Он живет в Неймегене, занимается программированием и зарабатывает этим на жизнь. Помимо программирования Стивен увлекается боевыми искусствами, любит поесть и, конечно же, выпить хорошего виски.
Марк Симан (Mark Seemann) — программист, проектировщик программных средств и лектор, живет в столице Дании Копенгагене. Разработкой программных средств он занимается с 1995 года, а технологией TDD увлекается с 2003-го, в том числе шесть лет был консультантом, разработчиком и проектировщиком в компании Microsoft. В настоящий момент Марк занимается разработкой ПО. Он увлекается чтением, рисованием, игрой на гитаре, любит хорошее вино и изысканную еду.
На обложку книги помещено изображение под названием «Женщина из Водняна», где показана жительница небольшого городка, расположенного на хорватском полуострове Истрия, омываемом водами Адриатического моря. Эта репродукция из альбома традиционных хорватских костюмов середины XIX века, составленного Николой Арсеновичем и опубликованного Этнографическим музеем хорватского города Сплита в 2003 году. Иллюстрации были любезно предоставлены библиотекарем Этнографического музея Сплита, который находится в Римском квартале средневекового центра города, там же, где и руины дворца уединения римского императора Диоклетиана, построенного приблизительно в 304 году нашей эры. Альбом содержит превосходные цветные изображения жителей различных регионов Хорватии, дополненные описаниями костюмов и сцен из повседневной жизни. Воднян — это важный в культурном и историческом отношении город, расположенный на возвышенности с прекрасным видом на Адриатическое море и известный своими многочисленными храмами и драгоценными предметами культа. Женщина на обложке одета в длинную черную льняную юбку и короткий черный жакет поверх белой льняной рубашки. Жакет отделан синей вышивкой, а весь костюм завершает синий льняной фартук. На женщине также широкополая черная шляпа, шарф в цветочек и большие серьги в форме колец. Ее элегантный костюм выдает в ней городскую, а не сельскую жительницу. Народные костюмы в окружающей сельской местности более колоритны, сшиты из шерстяной ткани и украшены богатой вышивкой.
За последние 200 лет стиль одежды и жизнь изменились и различия между регионами, столь существенные в былые времена, постепенно стерлись. Сейчас трудно отличить друг от друга людей с разных континентов, не говоря уже о жителях деревень или городов, разделенных всего несколькими километрами. Возможно, культурное разнообразие заменили более разнообразная личная жизнь и, конечно же, многообразная и бурно развивающаяся жизнь в мире высоких технологий.
Издательство Manning воздает должное изобретательности и инициативности компьютерного бизнеса, выбирая для книжных обложек подобные приметы богатого разнообразия региональной жизни двухвековой давности, воскрешаемые в памяти благодаря иллюстрациям из старых книг и коллекций.
Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Внедрение зависимостей (Dependency Injection, DI) — одна из концепций объектно-ориентированного программирования, чаще остальных подвергаемая неправильному толкованию. В отношении терминологии, цели и механизмов царит неопределенность. Как в действительности следует называть этот паттерн проектирования? Внедрением зависимостей? Инверсией зависимостей (Dependency Inversion)? Или инверсией управления (Inversion of Control)? А может, подключением стороннего кода (Third-Party Connect)? Является ли целью DI исключительно поддержка модульного тестирования, или же у нее более широкая область применения? Равнозначны ли понятия DI и локации сервисов (Service Location)? Есть ли необходимость в DI-контейнерах?
Теме DI посвящено огромное количество интернет-публикаций, журнальных статей, презентаций, используемых на различных конференциях, однако весь этот информационный поток грешит использованием противоречивой терминологии и плохими рекомендациями. Наблюдается повсеместная неразбериха, привносимая даже такими большими и влиятельными игроками, как компания Microsoft.
Так быть не должно. В этой книге представлена ясная терминология, не допускающая двоякого толкования. В подавляющем числе случаев мы принимали и уточняли уже существующую терминологию, определенную до нас другими людьми, но временами мы вносили и собственный скромный вклад, заполняющий имеющиеся пробелы. Все это очень помогло при определении области применения (границ) DI.
Одна из основных причин рассогласованности и плохих рекомендаций кроется в сильной размытости границ DI. Где заканчивается DI и начинается другая объектно-ориентированная концепция? Похоже, провести четкую разделительную линию между DI и другими аспектами создания качественного объектно-ориентированного кода не представляется возможным. Чтобы говорить о DI, приходится вникать в особенности и других концепций, таких как SOLID, Clean Code (чистый код) и даже Aspect-Oriented Programming (аспектно-ориентированное программирование). Достоверное изложение вопросов, касающихся DI, без этого попросту невозможно.
Первая часть книги поможет вам разобраться в том, какое место занимает DI по отношению к другим аспектам разработки программных средств, то есть получить общее представление.
В главе 1 будет дан краткий обзор DI, охватывающий цели технологии, принципы и получаемые преимущества, а также будет раскрыто содержание остальной части книги — обрисована общая картина, без описания подробностей. Если вам необходимо понять, в чем состоит суть DI и чем оно может заинтересовать вас, то начать нужно с изучения этой главы. При этом глава 1 допускает, что у вас могут отсутствовать даже поверхностные знания о DI. Тем же, кто уже имеет представление о DI, мы настоятельно советуем не пропускать этот информативный блок. Вполне может оказаться, что для любого читателя в ней найдется много интересного.
А вот главы 2 и 3 целиком отведены под один большой пример, который предназначен для того, чтобы дать более конкретное представление о DI. Чтобы показать отличие DI от более традиционного стиля программирования, в главе 2 демонстрируется обычная реализация приложения онлайн-торговли, имеющего сильное связывание, которое затем, в главе 3, последовательно переделывается под использование DI.
В этой части DI будет рассматриваться в общих понятиях. Это значит, что мы не будем использовать так называемый DI-контейнер (DI Container). Возможность применения DI без использования контейнера существует. DI-контейнер — полезный, но вспомогательный инструмент. Поэтому в частях I, II и III DI-контейнеры фактически полностью игнорируются, и разговор о внедрении зависимостей ведется без их упоминания. Затем, в части IV, мы вернемся к вопросу о DI-контейнерах, чтобы проанализировать применение трех специализированных библиотек.
Часть I определяет содержание всей остальной книги. Она предназначена для тех читателей, кто только начинает знакомство с DI. Однако из беглого изучения ее глав могут извлечь определенную пользу и читатели с опытом практического применения DI, усвоив при этом терминологию, повсеместно используемую в настоящем издании. После прочтения части I книги должно сложиться четкое представление о терминологии и общих понятиях, пусть даже при этом некоторые подробности останутся все еще немного расплывчатыми. Не стоит пугаться — по мере погружения в тему все встанет на свои места, а части II, III и IV ответят на те вопросы, которые, скорее всего, появятся после прочтения части I.