Создание сервисов

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

Платформа 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()}")
Тестирование внедрения зависимостей в ASP.NET Core и Visual Basic .NET

Поскольку метод AddTransient установил зависимость между ITimeService и ShortTimeService, то в браузере выводится текущее время в формате "hh:mm". Мы можем поменять тип, сопоставляемый с ITimeService:

builder.Services.AddTransient(Of ITimeService, LongTimeService)()

И в этом случае мы увидим другое сообщение.

механизм Dependency Injection в ASP.NET Core и Visual Basic .NET

Сервис как конкретный класс

При этом необязательно разделять определение сервиса в виде интерфейса и его реализацию. Сам термин "сервис" в данном случае может представлять любой объект, функциональность которого может использоваться в приложении.

Например, изменим код файла 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()
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850