Внедрение зависимостей или 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 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
Кроме ряда подключаемых по умолчанию сервисов 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, благодаря чему мы сможем их использовать
в приложении.