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

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

Итак, мы можем использовать встроенные сервисы как IWebHostEnvironment или сервисы, которые предоставляет ASP.NET Core и которые надо дополнительно добавлять в приложение типа MVC. Но также мы можем создавать свои собственные сервисы. Рассмотрим, как это сделать.

Добавим в проект новую папку Services. А в ней определим новый интерфейс IMessageSender:

public interface IMessageSender
{
    string Send();
}

И добавим в папку Services два класса, которые будут реализовать данный интерфейс. Первый класс будет называться EmailMessageSender:

public class EmailMessageSender : IMessageSender
{
    public string Send()
    {
        return "Sent by Email";
    }
}

Второй класс будет называться SmsMessageSender:

public class SmsMessageSender : IMessageSender
{
    public string Send()
    {
        return "Sent by SMS";
    }
}

Используем функциональные возможности интерфейса IMessageSender в классе Startup:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using DIApp.Services;

namespace DIApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IMessageSender, EmailMessageSender>();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IMessageSender messageSender)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(messageSender.Send());
            });
        }
    }
}

С помощью вызова services.AddTransient<IMessageSender, EmailMessageSender>(); в методе ConfigureServices система на место объектов интерфейса IMessageSender будет передавать экземпляры класса EmailMessageSender. После добавления в ConfigureServices сервисы можно получить и использовать в любой части приложения. И через параметр метода Configure мы можем получить сервис и использовать его.

И теперь запустим приложение:

Тестирование внедрения зависимостей в ASP.NET Core

Поскольку метод AddTransient установил зависимость между IMessageSender и EmailMessageSender, то в браузере выводится сообщение "Sent by email." Мы можем поменять тип, сопоставляемый с IMessageSender:

services.AddTransient<IMessageSender, SmsMessageSender>();

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

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

Например, определим новый класс TimeService:

public class TimeService
{
    public string GetTime() => System.DateTime.Now.ToString("hh:mm:ss");
} 

Данный класс определяет один метод GetTime(), который возвращает текущее время.

Используем этот класс в качестве сервиса в классе Startup:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using DIApp.Services;

namespace DIApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<TimeService>();
        }

        public void Configure(IApplicationBuilder app, TimeService timeService)
        {
            app.Run(async (context) =>
            {
				context.Response.ContentType = "text/html; charset=utf-8";
                await context.Response.WriteAsync($"Текущее время: {timeService?.GetTime()}");
            });
        }
    }
}

Для добавления сервиса в эту коллекцию применяется метод AddTransient():

services.AddTransient<TimeService>();

После добавления сервиса мы его можем получить и использовать в любой части приложения. В частности, мы его можем получить с помощью параметра метода Configure. В итоге браузер выведет текущее время:

DependencyInjection in Configure ASP.NET Core

Расширения для добавления сервисов

Нередко для сервисов создают собственные методы добавления в виде методов расширения для интерфейса IServiceCollection. Например, создадим подобный метод для сервиса TimeService:

using Microsoft.Extensions.DependencyInjection;

public static class ServiceProviderExtensions
{
    public static void AddTimeService(this IServiceCollection services)
    {
        services.AddTransient<TimeService>();
    }
}

И теперь используем этот метод:

public void ConfigureServices(IServiceCollection services)
{
    services.AddTimeService();
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850