Внедрение Зависимостей в ASP.NET Core. Начало (1/4)
ASP.NET Core активно использует внедрение зависимостей. Теорию я описывал в этом посте, а тут будет только практика.
По умолчанию в приложениях используется контейнер внедрения зависимостей (контейнер DI) от Microsoft, который несколько ограничен в функционале, по сравнению с другими, но подходит в большинстве случаев. Он находится в отдельной библиотеке в пространстве имён
Microsoft.Extensions.DependencyInjection. В проект он обычно включается в составе метапакета Microsoft.AspNetCore.All.Необходимые для внедрения интерфейсы и классы (также называемые сервисами) регистрируются в коллекции типа
IServiceCollection. Чаще всего это происходит в методе ConfigureServices класса Startup. Во время работы приложения контейнер DI отвечает за обнаружение необходимого сервиса и создание его экземпляра с нужным сроком жизни.public void ConfigureServices(IServiceCollection services) { … }
Параметр services на момент вызова метода будет инициализирован хостом. В отличие от регистрации промежуточного ПО в методе Configure, порядок регистрации сервисов чаще всего не имеет значения.Что регистрировать в сервисах?
В первую очередь – зависимости. Просмотрите свой код и найдите использования ключевого слова
new. Если ваш класс A создаёт экземпляр класса B, вызывает его методы и использует результат их работы, то класс A зависит от класса B. class A {
public MethodA() {
var b = new B();
b.MethodB();
}
}
Класс B - кандидат на регистрацию в сервисах. В общем случае это делается в 3 этапа:1. Выделяем интерфейс из класса
B:interface InterfaceB {
void MethodB();
}
class B : InterfaceB {…}
2. Добавляем интерфейс в параметры конструктора класса A:class A {
private readonly InterfaceB _b;
public A(InterfaceB b) {
_b = b;
}
}
3. Регистрируем реализацию интерфейса в контейнере DI:services.AddTransient<InterfaceB, B>();
Однако, если, например, метод действия контроллера использует new для создания объекта модели и передаёт её в представление, то модель в этом случае используется для передачи данных между слоями приложения, и не является зависимостью.
В коде приложения могут появиться цепочки зависимостей, когда класс
A зависит от класса B, а тот зависит от C. Контейнер DI способен разрешать эти зависимости и находить соответствующие сервисы автоматически.Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspdotnet-core-dependency-injection/