Главная страница   /   4. DI паттерны (Внедрение зависимостей в .NET

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

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

Марк Симан

4. DI паттерны

Меню

  • Constructor Injection
  • Property Injection
  • Method Injection
  • Ambient Context

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

Соусы являются отличным примером того, как повара используют свою профессиональную терминологию. В главе 1 мы кратко обсудили sauce béarnaise, но я не уточнил таксономию, которая его окружает (см. рисунок 4-1).

Рисунок 4-1: Некоторые соусы основаны на sauce hollandaise. В sauce béarnaise лимон заменяется уменьшенным количеством уксуса и определенными травами, в то время как отличительной чертой sauce mousseline является то, что в него вымешиваются взбитые сливки: эта технология также используется для изготовления mousse au chocolat.

sauce béarnaise – это в действительности sauce hollandaise, где лимонный сок заменяется уменьшенным количеством уксуса, луком-шалотом, кервелем и эстрагоном. Другие соусы основаны на sauce hollandaise, в том числе мой любимый, sauce mousseline, который сделан с вымешиванием взбитых сливок в hollandaise.

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

Термин вымешать не ограничивается соусами: это общий способ совместить что-то взбитое с другими ингредиентами. При создании классического шоколадного мусса (mousse au chocolat), например, я вымешиваю взбитые яичные белки в смесь взбитых яичных желтков и растопленного шоколада.

При разработке программного обеспечения у нас самих есть сложный и непроходимый жаргон. Хотя вы можете и не знать, что относится к поварскому термину bain-marie, я уверен, что большинство поваров будут совершенно потеряны, если вы скажете им, что "строки являются неизменными классами, представляющими последовательности Unicode символов".

Когда дело доходит до разговоров о том, как структурировать код для решения конкретного типа задач, у нас есть паттерны проектирования, которые дают имена общим решениям. Таким же образом, как термины sauce hollandaise и вымешивать помогают нам поговорить о том, как сделать sauce mousseline, паттерны помогают нам говорить о том, как структурирован код. Система событий в .NET основана на паттерне проектирования Наблюдатель (Observer), а циклы foreach на Итератор (Iterator).

В этой главе я расскажу о четырех основных DI паттернах, перечисленных на рисунке 4-2. Поскольку глава построена так, чтобы показать каталог паттернов, каждый паттерн описан так, чтобы его можно было прочитать отдельно. Тем не менее, Внедрение в конструктор (Constructor Injection) на сегодняшний день является наиболее важным из четырех паттернов.

Рисунок 4-2: Структура этой главы принимает форму каталога паттернов. Каждый паттерн описан так, что вы можете прочитать о нем отдельно от других паттернов.

Не беспокойтесь, если вы обладаете ограниченными знаниями паттернов проектирования в целом. Основная цель паттерна проектирования заключается в создании подробного и автономного описания конкретного способа достижения цели – рецепта, если угодно.

Для каждого шаблона я приведу краткое описание, пример кода, преимущества и недостатки и так далее. Вы можете прочитать обо всех четырех паттернах или ограничиться только теми, которые вас интересуют. Наиболее важным паттерном является Внедрение в конструктор (Constructor Injection), который вы должны использовать в большинстве ситуаций; вы увидите другие все более и более специализированные паттерны по мере продвижения по главе.

4.1. Внедрение в конструктор (Constructor Injection)

4.2. Внедрение в свойство (Property Injection)

4.3. Внедрение в метод (Method Injection)

4.4. Окружающий контекст (Ambient Context)

4.5. Резюме