Внедрение зависимостей (также известное как DI) — это шаблон проектирования, в котором объект получает объекты, от которых он зависит, а не создает их напрямую. Внедрение зависимостей облегчает слабую связь, повышает тестируемость и простоту обслуживания. Это позволяет вам изменять свои реализации, не меняя классы или интерфейсы, которые используют эти реализации.
Поддержка внедрения зависимостей включена в ASP.NET Core. В результате вы можете внедрить в свои классы как инфраструктуру, так и службы приложений, а не зависеть от тесно связанных компонентов.
Simple Injector — это бесплатная, быстрая и гибкая версия библиотеки управления, простая в использовании и настройке. Он поддерживает приложения .NET Core, Xamarin, Mono и Universal и легко интегрируется с веб-API, MVC, WCF, ASP.NET Core и т. д.
В этой статье рассказывается о том, как мы можем использовать Simple Injector для реализации внедрения зависимостей в ASP.NET Core MVC.
Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена Visual Studio 2019. Если у вас еще нет копии, вы можете скачать Visual Studio 2019 здесь.
Создайте проект ASP.NET Core MVC в Visual Studio 2019.
Прежде всего давайте создадим проект ASP.NET Core MVC в Visual Studio 2019. Выполнение этих шагов позволит создать новый проект ASP.NET Core MVC в Visual Studio 2019 с использованием .NET 5.
- Запустите интегрированную среду разработки Visual Studio.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web App (Model-View-Controller)» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» выберите .NET 5.0 в качестве целевой платформы из раскрывающегося списка вверху. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить Docker», «Настроить для HTTPS» и «Включить компиляцию среды выполнения Razor» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Мы будем использовать этот проект для работы с Simple Injector в последующих разделах этой статьи. Теперь выполните шаги, описанные ниже, чтобы создать дополнительные контроллеры в вашем проекте:
- Щелкните правой кнопкой мыши папку решения «Контроллеры».
- Выберите Добавить -> Контроллер.
- В диалоговом окне «Добавить новый шаблонный элемент» выберите API в качестве шаблона (по умолчанию будет выбран MVC).
- Выберите пункт «API-контроллер с действиями чтения/записи».
- Нажмите Добавить.
- В диалоговом окне «Добавить новый элемент», показанном ниже, укажите имя для вашего нового контроллера.
- Нажмите Добавить
Установите пакет NuGet Simple Injector
Если вы успешно создали проект ASP.NET Core MVC, следующее, что вам нужно сделать, — это добавить в проект необходимые пакеты NuGet. Для этого выберите проект в окне обозревателя решений, щелкните правой кнопкой мыши и выберите «Управление пакетами NuGet…». В окне диспетчера пакетов NuGet найдите следующий пакет и установите его.
SimpleInjector.Integration.AspNetCore.Mvc
Альтернативно вы можете установить пакет через консоль диспетчера пакетов NuGet, как показано ниже.
PM> Install-Package SimpleInjector.Integration.AspNetCore.Mvc
Демонстрация Simple Injector в ASP.NET Core MVC
Чтобы продемонстрировать внедрение зависимостей с помощью Simple Injector, мы сначала создадим сервис, но только с минимальной реализацией для простоты. Создайте класс с именем DemoService и вставьте следующий код:
namespace SimpleInjectorDemo
{
public class DemoService: IDemoService
{
public string GetMessage()
{
return "Inside GetMessage method...";
}
}
}
Класс DemoService реализует интерфейс IDemoService. Вот интерфейс IDemoService для справки:
namespace SimpleInjectorDemo
{
public interface IDemoService
{
public string GetMessage();
}
}
Настройка простого инжектора в ASP.NET Core MVC
Затем напишите следующий фрагмент кода в методе ConfigurationServices класса Startup. Это устанавливает базовую конфигурацию для интеграции Simple Injector с ASP.NET Core MVC.
services.AddSimpleInjector(container, options =>
{
options.AddAspNetCore()
.AddControllerActivation();
});
Вы можете зарегистрировать свой сервис в методе ConfigurationServices класса Startup, используя любой из трех методов класса LifeStyle:
- Синглтон
- Область действия
- Переходный процесс
Вы можете написать следующий фрагмент кода в методе ConfigurationServices, чтобы зарегистрировать экземпляр DemoService.
container.Register<IDemoService, DemoService>(Lifestyle.Singleton);
Вот полный код метода ConfigurationServices для справки:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSimpleInjector(container, options =>
{
options.AddAspNetCore()
.AddControllerActivation();
});
container.Register<IDemoService, DemoService>(Lifestyle.Singleton);
}
Теперь добавьте следующий фрагмент кода в метод Configure класса Startup:
app.UseSimpleInjector(container);
Вот полный код метода Configuration для справки:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseSimpleInjector(container);
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints = >{
endpoints.MapControllerRoute(
name: "default", pattern:
"{controller=Home}/{action=Index}/{id?}");
});
}
Обновите файл Index.cshtml в ASP.NET Core MVC.
Замените исходный код по умолчанию файла Index.cshtml следующим кодом:
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1>"@ViewBag.Message"</h1>
</div>
Используйте внедрение зависимостей в контроллере в ASP.NET Core MVC.
Теперь мы воспользуемся внедрением конструктора в HomeController, чтобы получить экземпляр DemoService. Следующий фрагмент кода показывает, как этого можно добиться.
public class HomeController : Controller
{
private IDemoService _demoService;
public HomeController(IDemoService demoService)
{
_demoService = demoService;
}
public IActionResult Index()
{
ViewBag.Message = _demoService.GetMessage();
return View();
}
//Other action methods
}
Здесь свойству Message экземпляра ViewBag присваивается текстовое сообщение, которое получается с помощью вызова метода GetMessage класса DemoService.
Когда вы запустите приложение, вы увидите текстовое сообщение «Внутри метода GetMessage…», отображаемое в веб-браузере, как показано на рисунке 1 ниже.
Рисунок 1. Внедрение зависимостей в действии!
Simple Injector устраняет обычные сложности инверсии библиотеки управления и упрощает использование внедрения зависимостей в ASP.NET Core.
Наконец, обратите внимание, что при желании вы можете вызвать метод Verify класса Container в методе Configuration, как показано ниже:
container.Verify();
В этом случае метод Verify выдаст исключение, если в указанной вами конфигурации есть какая-либо ошибка.