Платформа ASP.NET Core предоставляет ряд встроенных сервисов, готовых к использованию. Однако при необходимости также можно создавать свои собственные сервисы. Рассмотрим, как это сделать.
Определим в проекте новый интерфейс ITimeService, который предназначен для получения времени:
Interface ITimeService Function GetTime() As String End Interface
Предполагается, что метод Gettime будет возвращать время в виде строки в определенном формате.
И также определим два класса, которые будут реализовать данный интерфейс. Первый класс будет называться ShortTimeService
и будет возвращать текущее время в формате hh:mm
(то есть часы и минуты):
'время в формате hh:mm Class ShortTimeService Implements ITimeService Public Function ITimeService_GetTime() As String Implements ITimeService.GetTime Return Now.ToShortTimeString() End Function End Class
Второй класс будет называться LongTimeService - он будет возвращать время в формате hh:mm:ss
:
'время в формате hh:mm:ss Class LongTimeService Implements ITimeService Public Function ITimeService_GetTime() As String Implements ITimeService.GetTime Return Now.ToLongTimeString() End Function End Class
Теперь используем сервис ITimeService в приложении. Для этого определим в файле Program.vb следующий код:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Imports Microsoft.Extensions.DependencyInjection Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) 'добавляем сервис в приложение builder.Services.AddTransient(Of ITimeService, ShortTimeService)() Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task 'получаем сервис Dim timeService = app.Services.GetService(Of ITimeService)() Await context.Response.WriteAsync($"Time: {timeService?.GetTime()}") End Function) app.Run() End Sub Interface ITimeService Function GetTime() As String End Interface 'время в формате hh:mm Class ShortTimeService Implements ITimeService Public Function ITimeService_GetTime() As String Implements ITimeService.GetTime Return Now.ToShortTimeString() End Function End Class 'время в формате hh:mm:ss Class LongTimeService Implements ITimeService Public Function ITimeService_GetTime() As String Implements ITimeService.GetTime Return Now.ToLongTimeString() End Function End Class End Module
Здесь надо выделить два момента. Во-первых, добавление сервиса в коллекцию сервисов приложения:
builder.Services.AddTransient(Of ITimeService, ShortTimeService)()
Благодаря вызову AddTransient(Of ITimeService, ShortTimeService)()
система на место объектов интерфейса ITimeService
будет передавать экземпляры класса ShortTimeService.
Кроме того, сервисы добавляются до создания объекта WebApplication методом Build()
объекта WebApplicationBuilder:
' добавление сервисов builder.Services.AddTransient(Of ITimeService, ShortTimeService)(); ' создание объекта WebApplication Dim app = builder.Build()
После добавления сервиса его можно получить и использовать в любой части приложения. Для получения сервиса могут применяться различные способы в зависимости от ситуации. В данном случае используется свойство app.Services, которое предоставляет провайдер сервисов - объект IServiceProvider. Для получения сервиса у провайдера сервиса вызывается метод GetService(), который типизируется типом сервиса:
Dim timeService = app.Services.GetService(Of ITimeService)()
После получения сервиса мы можем использовать его.
Await context.Response.WriteAsync($"Time: {timeService?.GetTime()}")
Поскольку метод AddTransient установил зависимость между ITimeService и ShortTimeService, то в браузере выводится текущее время в формате "hh:mm". Мы можем поменять тип, сопоставляемый с ITimeService:
builder.Services.AddTransient(Of ITimeService, LongTimeService)()
И в этом случае мы увидим другое сообщение.
При этом необязательно разделять определение сервиса в виде интерфейса и его реализацию. Сам термин "сервис" в данном случае может представлять любой объект, функциональность которого может использоваться в приложении.
Например, изменим код файла Program.vb следующим образом:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Imports Microsoft.Extensions.DependencyInjection Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) 'добавляем сервис в приложение builder.Services.AddTransient(Of TimeService)() Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task 'получаем сервис Dim timeService = app.Services.GetService(Of TimeService)() Await context.Response.WriteAsync($"Time: {timeService?.GetTime}") End Function) app.Run() End Sub 'время в формате hh:mm Class TimeService Public Function GetTime() As String Return Now.ToShortTimeString() End Function End Class End Module
Здесь сервис определен в виде класса
Class TimeService Public Function GetTime() As String Return Now.ToShortTimeString() End Function End Class
Данный класс определяет один метод GetTime()
, который возвращает текущее время.
Для добавления сервиса в эту коллекцию применяется метод AddTransient()
:
builder.Services.AddTransient(Of TimeService)();
После добавления сервиса мы его можем получить и использовать в любой части приложения.
Нередко для сервисов создают собственные методы добавления в виде методов расширения для интерфейса IServiceCollection. Например, создадим и используем подобный метод для сервиса TimeService:
Imports System.Runtime.CompilerServices Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Imports Microsoft.Extensions.DependencyInjection Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) 'добавляем сервис в приложение builder.Services.AddTimeService() Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task 'получаем сервис Dim timeService = app.Services.GetService(Of TimeService)() Await context.Response.WriteAsync($"Time: {timeService?.GetTime}") End Function) app.Run() End Sub <Extension()> Public Sub AddTimeService(services As IServiceCollection) services.AddTransient(Of TimeService)() End Sub Class TimeService Public Function GetTime() As String Return Now.ToShortTimeString() End Function End Class End Module
Итак, здесь определен метод расширения AddTimeService, который добавляет сервис TimeService:
<Extension()> Public Sub AddTimeService(services As IServiceCollection) services.AddTransient(Of TimeService)() End Sub
И для регистрации сервиса TimeService в приложениии достаточно вызвать данный метод:
builder.Services.AddTimeService()