Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Итак, мы можем использовать встроенные сервисы как 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 мы можем получить сервис и использовать его.
И теперь запустим приложение:
Поскольку метод 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
. В итоге браузер выведет текущее время:
Нередко для сервисов создают собственные методы добавления в виде методов расширения для интерфейса 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(); }