Парадигма внедрения зависимостей (DI) в течение минувшего десятилетия де-факто стала одной из доминирующих на платформе .NET и теперь обязательна к изучению для всех .NET-разработчиков. Это переработанное и дополненное издание классической книги «Внедрение зависимостей в .NET». Вы научитесь правильно внедрять зависимости для устранения жесткой связи между компонентами приложения. Познакомитесь с подробными примерами и усвоите основы работы с ключевыми библиотеками, необходимыми для внедрения зависимостей в .NET и .NET Core.
Author(s): Марк Симан, Стивен ван Дерсен
Series: Библиотека программиста
Edition: 2
Publisher: Питер
Year: 2021
Language: Russian
Commentary: Vector PDF
Pages: 608
City: СПб.
Tags: C#; ASP.NET; Design Patterns; Object-Oriented Programming; Programming Style; Model-View-Connector; Dependency Injection; Aspect-oriented Programming; Anti-Patterns
От издательства
Об иллюстрации на обложке
Об авторах
Об этой книге
Для кого предназначена эта книга
Структура издания
Стандарт оформления кода и материалы для скачивания
Благодарности
Предисловие
Часть I. Общее представление о месте, занимаемом внедрением зависимостей
1
Глава 1. Основы внедрения зависимостей: что, зачем и как
1.1. Создание сопровождаемого кода
1.1.1. Устоявшиеся мифы о DI
1.1.2. Определение цели DI
1.2. Простой пример: Hello DI!
1.2.1. Код Hello DI!
1.2.2. Преимущества, получаемые от применения DI
1.3. Что следует, а что не следует внедрять
1.3.1. Стабильные зависимости
1.3.2. Нестабильные зависимости
1.4. Область применения DI
1.4.1. Компоновка объектов
1.4.2. Время жизни объектов
1.4.3. Перехват
1.4.4. DI в трех измерениях
1.5. Заключение
Резюме
2
Глава 2. Создание кода с сильной связанностью
2.1. Создание приложения с сильной связанностью
2.1.1. Познакомьтесь с Мэри Роуэн
2.1.2. Создание уровня данных
2.1.3. Создание уровня доменной логики
2.1.4. Создание уровня пользовательского интерфейса
2.2. Оценка приложения с сильной связанностью
2.2.1. Оценка схемы зависимостей
2.2.2. Оценка компонуемости
2.3. Анализ недостающей компонуемости
2.3.1. Анализ схемы зависимостей
2.3.2. Анализ интерфейса доступа к данным
2.3.3. Прочие вопросы
2.4. Заключение
Резюме
3
Глава 3. Создание кода со слабой связанностью
3.1. Создание нового варианта приложения электронной торговли
3.1.1. Создание пользовательского интерфейса, более поддающегося сопровождению
3.1.2. Создание независимой доменной модели
3.1.3. Создание нового уровня доступа к данным
3.1.4. Реализация адаптера IUserContext, учитывающего специфику среды ASP.NET Core
3.1.5. Компоновка приложения в корне композиции
3.2. Анализ реализации со слабой связанностью
3.2.1. Осмысление взаимодействия компонентов
3.2.2. Анализ новой схемы зависимостей
Резюме
Часть II. Каталог
Глава 4. Паттерны внедрения зависимостей
4.1. Корень композиции
4.1.1. Принцип работы корня композиции
4.1.2. Использование DI-контейнера в корне композиции
4.1.3. Пример: реализация корня композиции с использованием чистой технологии DI
4.1.4. Кажущийся взрыв зависимостей
4.2. Внедрение через конструктор
4.2.1. Принцип работы внедрения через конструктор
4.2.2. Когда следует использовать внедрение через конструктор
4.2.3. Известные примеры использования внедрения через конструктор
4.2.4. Пример: Добавление конвертации валюты к прейскуранту предлагаемых товаров
4.2.5. Краткое заключение
4.3. Внедрение через метод
4.3.1. Принцип работы внедрения через метод
4.3.2. Когда следует использовать внедрение через метод
4.3.3. Известные примеры применения внедрения через метод
4.3.4. Пример: добавление конвертации валюты в сущность товаров Product
4.4. Внедрение через свойство
4.4.1. Принцип работы внедрения через свойство
4.4.2. Когда следует использовать внедрение через свойство
4.4.3. Известные примеры использования внедрения через свойство
4.4.4. Пример: внедрение через свойство, применяемое в качестве модели расширяемости многократно используемой библиотеки
4.5. Выбор используемого паттерна
Резюме
Глава 5. Антипаттерны внедрения зависимостей
5.1. Антипаттерн «Диктатор»
5.1.1. Пример: антипаттерн «Диктатор», полученный путем обновления зависимостей с применением ключевого слова new
5.1.2. Пример: антипаттерн «Диктатор», полученный в результате использования фабрик
5.1.3. Пример: антипаттерн «Диктатор», полученный при использовании переопределяемых конструкторов
5.1.4. Анализ антипаттерна «Диктатор»
5.2. Антипаттерн «Локатор сервисов»
5.2.1. Пример: ProductService, использующий локатор сервисов
5.2.2. Анализ антипаттерна «Локатор сервисов»
5.3. Антипаттерн «Окружающий контекст»
5.3.1. Пример: получение данных о времени через «Окружающий контекст»
5.3.2. Пример: ведение регистрационных записей с помощью окружающего контекста
5.3.3. Анализ антипаттерна «Окружающий контекст»
5.4. Антипаттерн «Ограниченная конструкция»
5.4.1. Пример: позднее связывание ProductRepository
5.4.2. Анализ антипаттерна «Ограниченная конструкция»
Резюме
Глава 6. Проблемный код
6.1. Как справиться с проблемным кодом избыточного внедрения через конструктор
6.1.1. Распознавание избыточного внедрения через конструктор
6.1.2. Переделка избыточного внедрения через конструктор в фасадные сервисы
6.1.3. Переделка избыточного внедрения через конструктор в доменные события
6.2. Злоупотребление абстрактными фабриками
6.2.1. Злоупотребление абстрактными фабриками для преодоления проблем с временем существования объектов
6.2.2. Злоупотребление абстрактными фабриками при выборе возвращаемой зависимости на основе данных среды выполнения
6.3. Устранение зацикленности зависимостей
6.3.1. Пример: зацикленность зависимостей, вызванная нарушением принципа единственной ответственности
6.3.2. Анализ зацикленности зависимостей, с которой столкнулась Мэри
6.3.3. Избавление от нарушений принципа единственной ответственности с целью решения проблемы зацикленности зависимостей
6.3.4. Общие стратегии избавления от зацикленности зависимостей
6.3.5. Крайнее средство: разрыв зацикленности путем использования внедрения через свойство
Резюме
Часть III. Чистое внедрение зависимостей
Глава 7. Компоновка приложений
7.1. Компоновка консольных приложений
7.1.1. Пример: обновление курсов валют с помощью программы UpdateCurrency
7.1.2. Построение корня композиции для программы UpdateCurrency
7.1.3. Компоновка графа объектов в CreateCurrencyParser
7.1.4. Более пристальный взгляд на разбиение UpdateCurrency на уровни
7.2. Компоновка UWP-приложений
7.2.1. Компоновка UWP
7.2.2. Пример: подключение полнофункционального клиента управления товарами
7.2.3. Реализация корня композиции UWP-приложения
7.3. Компоновка приложений среды ASP.NET Core MVC
7.3.1. Создание специализированного активатора контроллера
7.3.2. Создание собственных компонентов-прослоек с использованием чистой технологии DI
Резюме
Глава 8. Время жизни объектов
8.1. Управление временем жизни зависимостей
8.1.1. Введение в управление временем жизни
8.1.2. Управление временем жизни с применением чистой технологии DI
8.2. Работа с ликвидируемыми зависимостями
8.2.1. Потребление ликвидируемых зависимостей
8.2.2. Управление ликвидируемыми зависимостями
8.3. Каталог жизненных циклов зависимостей
8.3.1. Жизненный цикл Singleton
8.3.2. Жизненный цикл Transient
8.3.3. Жизненный цикл Scoped
8.4. Неудачный выбор жизненного цикла
8.4.1. Захваченные зависимости
8.4.2. Применение абстракций с протечкой, допускающей доступность для потребителей сведений о выбранном жизненном цикле
8.4.3. Ошибки одновременно выполняемых вычислений, вызываемые привязкой экземпляров к времени жизни потока
Резюме
Глава 9. Перехват
9.1. Введение в перехват
9.1.1. Паттерн проектирования «Декоратор»
9.1.2. Пример: реализация ведения контрольного журнала с помощью декоратора
9.2. Реализация сквозной функциональности
9.2.1. Перехват с использованием паттерна «Предохранитель»
9.2.2. Оповещение о выдаче исключений, выполняемое с помощью паттерна «Декоратор»
9.2.3. Использование декоратора для предотвращения несанкционированного доступа к функциям, работающим с конфиденциальной информацией
Резюме
Глава 10. Аспектно-ориентированное проектирование программного обеспечения
10.1. Введение в AOP
10.2. Принципы SOLID
10.2.1. Принцип единственной ответственности
10.2.2. Принцип открытости/закрытости
10.2.3. Принцип подстановки Лисков
10.2.4. Принцип изоляции интерфейса
10.2.5. Принцип инверсии зависимостей
10.2.6. SOLID-принципы и перехват
10.3. Соблюдение принципов SOLID как движущая сила AOP
10.3.1. Пример: реализация функций работы с товарами с использованием IProductService
10.3.2. Анализ IProductService с позиции соблюдения SOLID-принципов
10.3.3. Усовершенствование конструкции применением SOLID-принципов
10.3.4. Добавление новых аспектов сквозной функциональности
10.3.5. Заключение
Резюме
Глава 11. Аспектно-ориентированное программирование с помощью инструментальных средств
11.1. Динамический перехват
11.1.1. Пример: перехват с использованием Castle Dynamic Proxy
11.1.2. Анализ динамического перехвата
11.2. Автоматическое добавление аспектов в ходе компиляции
11.2.1. Пример: применение аспекта транзакции с автоматическим добавлением аспектов в ходе компиляции
11.2.2. Анализ автоматического добавления аспектов в ходе компиляции
Резюме
Часть IV. DI-контейнеры
Глава 12. Введение в DI-контейнеры
12.1. Введение в DI-контейнеры
12.1.1. Исследование контейнерного API, выполняющего разрешение
12.1.2. Автоматическое связывание Auto-Wiring
12.1.3. Пример: реализация упрощенного DI-контейнера, поддерживающего автоматическое связывание
12.2. Конфигурация DI-контейнеров
12.2.1. Конфигурирование контейнеров с помощью файлов конфигурации
12.2.2. Конфигурирование контейнеров с применением конфигурации в виде кода
12.2.3. Конфигурирование контейнеров по соглашению с использованием автоматической регистрации
12.2.4. Смешивание и сопоставление подходов к конфигурированию
12.3. Когда следует использовать DI-контейнер
12.3.1. Использование сторонних библиотек сопряжено с издержками и рисками
12.3.2. Чистая технология Di позволяет быстрее реагировать на происходящее
12.3.3. Вердикт: когда следует использовать DI-контейнер
Резюме
Глава 13. DI-контейнер Autofac
13.1. Введение в Autofac
13.1.1. Разрешение объектов
13.1.2. Конфигурирование ContainerBuilder
13.2. Управление временем жизни
13.2.1. Конфигурирование областей видимости экземпляров
13.2.2. Высвобождение компонентов
13.3. Регистрация сложных API
13.3.1. Конфигурирование элементарных зависимостей
13.3.2. Регистрация объектов с помощью блоков кода
13.4. Работа с несколькими компонентами
13.4.1. Выбор из нескольких кандидатов
13.4.2. Связывание последовательностей
13.4.3. Связывание декораторов
13.4.4. Связывание компоновщиков
Резюме
Глава 14. DI-контейнер Simple Injector
14.1. Введение в Simple Injector
14.1.1. Разрешение объектов
14.1.2. Конфигурирование контейнера
14.2. Управление временем жизни
14.2.1. Конфигурирование жизненных циклов
14.2.2. Высвобождение компонентов
14.2.3. Охватывающие области видимости
14.2.4. Диагностика контейнера для выявления наиболее распространенных проблем, связанных с временем жизни
14.3. Регистрация сложных API
14.3.1. Конфигурирование элементарных зависимостей
14.3.2. Извлечение элементарных зависимостей в граничные объекты
14.3.3. Регистрация объектов с помощью блоков кода
14.4. Работа с несколькими компонентами
14.4.1. Выбор из нескольких кандидатов
14.4.2. Связывание последовательностей
14.4.3. Связывание декораторов
14.4.4. Связывание компоновщиков
14.4.5. Последовательности и потоки данных
Резюме
Глава 15. DI-контейнер Microsoft.Extensions.DependencyInjection
15.1. Введение в Microsoft.Extensions.DependencyInjection
15.1.1. Разрешение объектов
15.1.2. Конфигурирование ServiceCollection
15.2. Управление временем жизни
15.2.1. Конфигурирование жизненных циклов
15.2.2. Высвобождение компонентов
15.3. Регистрация сложных API
15.3.1. Конфигурирование элементарных зависимостей
15.3.2. Извлечение элементарных зависимостей в граничные объекты
15.3.3. Регистрация объектов с помощью блоков кода
15.4. Работа с несколькими компонентами
15.4.1. Выбор из нескольких кандидатов
15.4.2. Связывание последовательностей
15.4.3. Связывание декораторов
15.4.4. Связывание компоновщиков
Резюме
Глоссарий
Список дополнительных источников
Книги
Онлайн-ресурсы
Другие ресурсы