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

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

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

Марк Симан

DI самостоятельно

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

Тем не менее, поскольку DI-контейнер является необязательным инструментом, я считаю, что важнее объяснить основные принципы и приемы, которые контейнеры обычно используют для реализации этих характеристик. В части 2 "DI самостоятельно" исследуется то, как вы можете сделать это самостоятельно, а не с помощью DI-контейнера. Теоретически вы можете использовать эту информацию для создания своего собственного DI-контейнера (но, пожалуйста, не делайте это – миру не нужен еще один DI-контейнер), или применять же механизм внедрения зависимостей вообще без использования контейнера – это то, что мы называем Poor man's DI. Однако главная цель этой части книги – изложить основные алгоритмы композиции объектов, управления жизненным циклом и механизма перехвата без необходимости использования конкретного DI-контейнера. Думаю, если бы я использовал конкретный контейнер, то было бы трудно отделить основные принципы от деталей конкретного API.

Глава 7 "Построение объектов" объясняет, как компоновать объекты в таких различных фреймворках, как ASP.NET MVC, WPF, WCF и т.д. Не все фреймворки в равной степени хорошо поддерживают механизм внедрения зависимостей, и даже среди тех, которые его поддерживают, способы, с помощью которых они это выполняют, значительно различаются. Для каждого фреймворка трудно идентифицировать шов, который разрешает механизм внедрения зависимостей в этом фреймворке. Тем не менее, при обнаружении этого шва вы получаете решение для всех приложений, которые используют этот конкретный фреймворк. В главе 7 я выполнил эту задачу для большинства общеизвестных фреймворков .NET приложений. Рассматривайте эту главу как каталог швов для фреймворков.

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

Несмотря на то, что компоновка объектов не усложняется благодаря Poor man's DI, вы должны начать понимать преимущества настоящего DI-контейнера после того, как прочтете о таком аспекте, как управление жизненным циклом. Существует возможность надлежащим образом управлять жизненным циклом различных объектов с помощью диаграммы объектов, но для этого нужно больше пользовательского кода, нежели для композиции объектов, и ни один из этих кодов не добавляет в приложение никакого конкретного бизнес-значения.

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

В главе "Механизм перехвата" мы рассматриваем часто встречающуюся проблему реализации сквозных сущностей на основе компонентов. Переходя окончательно от простого приложения паттерна проектирования Decorator к механизму перехвата в рабочей среде, мы рассматриваем способы формирования слабо связанных приложений в модульном исполнении. Я считаю эту главу кульминационной точкой книги – это то место, в котором многие читатели во время начальной программы по управлению доступом высказали мнение, что они начали понимать очертания чрезвычайно мощного способа моделирования программного обеспечения.

Несмотря на то, что я использую Poor man's DI для исследования и объяснения механизма внедрения зависимостей, я не рекомендую использовать его для профессионального использования. Многие отличные DI-контейнеры доступны на .NET и все они являются бесплатными. Таким образом, часть "DI-контейнеры" посвящена подробному рассмотрению API конкретного контейнера.

7. Построение объектов

8. Жизненный цикл объектов

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