Dependency Injection

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

Последнее обновление: 17.05.2022

Внедрение зависимостей или Dependency injection (DI) представляет механизм, который позволяет сделать компоненты приложения слабосвязанными. Такие объекты связаны между собой через абстракции, например, через интерфейсы, что делает всю систему более гибкой, более адаптируемой и расширяемой.

Преимуществом ASP.NET Core в этом оношении является то, что фреймворк уже по умолчанию имеет встроенный контейнер внедрения зависимостей, который представлен интерфейсом IServiceProvider. А сами зависимости еще называются сервисами, собственно поэтому контейнер можно назвать провайдером сервисов. Этот контейнер отвечает за сопоставление зависимостей с конкретными типами и за внедрение зависимостей в различные объекты.

Для управления сервисами в приложении ASP.NET Core в классе WebApplicationBuilder определено свойство Services, которое представляет объект IServiceCollection - коллекцию сервисов:

Imports Microsoft.Extensions.DependencyInjection
...............
Dim builder = WebApplication.CreateBuilder()
Dim allServices As IServiceCollection = builder.Services	'коллекция сервисов

И даже если мы не добавляем в эту коллекцию никаких сервисов, IServiceCollection уже содержит ряд сервисов по умолчанию

Сервисы в IServiceCollection в ASP.NET Core и Visual Basic .NET

Как видно на скриншоте, в коллекции IServiceCollection 82 сервиса, которые по умолчанию можно использовать в приложении. Это такие сервисы, как ILogger(Of T), ILoggerFactory, IWebHostEnvironment и ряд других. Они добавляются по умолчанию инфраструктурой ASP.NET Core. И мы их можем использовать в различных частях приложения.

Информация о сервисах

Каждый сервис в коллекции IServiceCollection представляет объект ServiceDescriptor, который несет некоторую информацию. В частности, наиболее важные свойства этого объекта:

  • ServiceType: тип сервиса

  • ImplementationType: тип реализации сервиса

  • Lifetime: жизненный цикл сервиса

Например, получим все сервисы, которые добавлены в приложение:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Imports System.Text

Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim services = builder.Services    'коллекция сервисов
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task
                    Dim sb = New StringBuilder()
                    sb.Append("<h1>Все сервисы</h1>")
                    sb.Append("<table>")
                    sb.Append("<tr><th>Тип</th><th>Lifetime</th><th>Реализация</th></tr>")
                    For Each service In services
                        sb.Append("<tr>")
                        sb.Append($"<td>{service.ServiceType.FullName}</td>")
                        sb.Append($"<td>{service.Lifetime}</td>")
                        sb.Append($"<td>{service.ImplementationType?.FullName}</td>")
                        sb.Append("</tr>")
                    Next
                    sb.Append("</table>")
                    context.Response.ContentType = "text/html;charset=utf-8"
                    Await context.Response.WriteAsync(sb.ToString)
                End Function)
        app.Run()
    End Sub
End Module
Получение всех сервисов их IServiceCollection в ASP.NET Core и Visual Basic .NET

Регистрация встроенных сервисов ASP.NET Core

Кроме ряда подключаемых по умолчанию сервисов ASP.NET Core имеет еще ряд встроенных сервисов, которые мы можем подключать в приложение при необходимости. Все сервисы и компоненты middleware, которые предоставляются фреймворком ASP.NET Core по умолчанию, регистрируются в приложение с помощью методов расширений IServiceCollection, имеющих общую форму Add[название_сервиса] и которые в основном расположены в пространстве имен Microsoft.Extensions.DependencyInjection.

Например:

Imports Microsoft.Extensions.DependencyInjection
...........
Dim builder = WebApplication.CreateBuilder()
builder.Services.AddMvc()

Для объекта IServiceCollection определено ряд методов расширений, которые начинаются на Add, как, например, AddMvc(). Эти методы добавляют в объект IServiceCollection соответствующие сервисы. Например, AddMvc() добавляет в приложение сервисы MVC, благодаря чему мы сможем их использовать в приложении.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850