Главная страница   /   9. Механизм перехвата (Внедрение зависимостей в .NET

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

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

Марк Симан

9. Механизм перехвата

Меню:

  • Сквозные сущности
  • Аспектно-ориентированное программирование
  • Динамический перехват

В кулинарии одно из самых интересных – это то, как мы можем смешивать между собой множество ингредиентов; некоторые из них сами по себе не очень вкусные, а их смесь намного вкуснее. Часто мы начинаем с простого ингредиента, составляющего основу блюда, а затем изменяем и приукрашиваем его до тех пор, пока, в конечном итоге, не получим превосходное блюдо.

Представьте себе говяжью отбивную. Если бы мы находились в полном отчаянии, то могли бы съесть ее сырой, но в большинстве случаев мы бы предпочли ее пожарить. Тем не менее, если мы просто шлепнем ее на горячую сковороду, то результат будет менее выдающимся. За исключением подгоревшего привкуса вы больше ничего не почувствуете.

К счастью, есть множество шагов, которые мы можем предпринять, чтобы повысить свою квалификацию:

  • Жарка отбивной в масле предотвратит мясо от подгорания, но вкус все равно останется слабым.
  • Добавление соли усилит вкус мяса.
  • Добавление других специй, например, перца, сделает вкус мяса более богатым.
  • Панировка отбивной в смеси из соли и специй не только добавит ей вкусовых качеств, но также придаст первоначальному ингредиенту новую структуру. На данном этапе мы приближаемся к тому, что называется котлетой.
  • Прорезание в отбивной кармашка и добавление в него ветчины, сыра и чеснока перед панировкой поднимет нас на пьедестал почета. Мы получили кордон блю, самое превосходное блюдо.

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

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

Этот подход может быть обобщен, что предоставляет нам возможность перехватить запрос потребителя к сервису; именно это мы и будем рассматривать в данной главе. Подобно говяжьей отбивной мы начинаем с основного ингредиента и добавляем больше ингредиентов для его улучшения, но, не меняем при этом его первоначальную суть. Механизм перехвата – одна из самых мощных возможностей, полученных нами благодаря слабому связыванию. Он позволяет нам с легкостью применять принцип единичной ответственности и концепцию разделения.

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

Рисунок 9-1 демонстрирует обзор структуры данной главы. После окончания изучения главы вы должны уметь использовать механизм перехвата для разработки слабо связанного кода согласно установленным принципам объектно-ориентированного проектирования. В частности вы должны приобрести способность успешно соблюдать концепцию разделения и применять сквозные сущности, при этом сохраняя код в отличном состоянии.

Рисунок 9-1: Вся структура данной главы достаточно линейна. Мы начнем с ознакомления с механизмом перехвата, включая пример. Далее мы перейдем к разговору о сквозных сущностях. Данный раздел главы не обременен теорией, но наполнен примерами, поэтому, если вы уже знакомы с данной темой, вы можете перейти прямо к последнему разделу, касающемуся аспектов. Этот раздел является кульминационной точкой главы, так как знакомит вас с усовершенствованной и, кроме того, гибкой концепцией механизма перехвата.

Поскольку понять, как работает механизм перехвата, не сложно, мы начнем с небольшого примера для того, чтобы определить контекст. Для того чтобы полноценно оценить возможности, мы должны изучить некоторые связанные понятия, например, аспектно-ориентированное программирование (AOP) и SOLID принципы, и связать их с механизмом перехвата с помощью примеров. В конечном счете, вы увидите, как можно использовать DI-контейнер для того, чтобы обобщить механизм перехвата и облегчить его применение.

Поскольку в основе механизма перехвата лежат хорошо известные паттерны проектирования и принципы объектно-ориентированного проектирования, данная глава наполнена различными примерами. Маршрут главы вполне прямолинеен, начинается с вводного примера и вырастает до более сложных понятий и примеров. Последнее и более продвинутое понятие можно быстро объяснить с помощью абстракции, но, поскольку это понятие, скорее всего, будет вам понятно только на примере, глава завершается примером, занимающим несколько страниц, который демонстрирует, как все работает.

Но прежде чем мы до этого доберемся, мы должны начать с самого начала.

9.1. Знакомство с механизмом перехвата

9.2. Реализация сквозных сущностей

9.3. Объявление аспектов

9.4. Резюме