Регистрация собственных сервисов в контейнере¶
Как уже упоминалось, чтобы контроллер UserControlller смог использовать сервис — реализацию интерфейса, переданного ему в конструкторе, этот сервис надо зарегистрировать в контейнере зависимостей. Также для этого необходимо зарегистрировать все зависимости этой реализации, и т.д.
Процесс регистрации сервисов (конфигурирование контейнера) состоит из ряда утверждений о сервисах, например:
- если сервису требуется
IEmailSender, используй экземплярEmailSender; - если сервису требуется
NetworkClient, используй экземплярNetworkClient; - если сервису требуется
MessageFactory, используй экземплярMessageFactory.
Эти утверждения выполняются путём вызова методов Add* у IServiceCollection в методе ConfigureServices(). Каждый метод указывает на три составляющие регистрации:
- тип сервиса
TService— класс или интерфейс, который будет запрошен в качестве зависимости; - тип реализации
TServiceилиTImplementation— класс, объект которого контейнер должен предоставить для разрешения зависимости. Это должен быть конкретный тип, который может совпадать с типом сервиса; - жизненный цикл — transient, singleton или scoped. Определяет, как долго должен использоваться экземпляр сервиса.
Пример:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<IEmailSender, EmailSender>();
services.AddScoped<NetworkClient>();
services.AddSingleton<MessageFactory>();
}
Как видно, здесь не указано, как конкретно создавать реализации. Контейнер в своей работе делает ряд предположений о типах-реализациях, и, чтобы данный способ регистрации работал, типы должны удовлетворять этим предположениям, а именно:
- это должен быть класс конкретного типа;
- у класса должен быть только один “допустимый” конструктор;
- чтобы конструктор был “допустимым”, все аргументы конструктора должны быть зарегистрированы в контейнере, или быть аргументами со значениями по умолчанию.
Последнее обновление :
23 апреля 2023 г.
Дата создания : 29 сентября 2022 г.
Дата создания : 29 сентября 2022 г.