Как использовать Simple Injector в ASP.NET Core MVC

автор vadim


Внедрение зависимостей (также известное как 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.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web App (Model-View-Controller)» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» выберите .NET 5.0 в качестве целевой платформы из раскрывающегося списка вверху. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить Docker», «Настроить для HTTPS» и «Включить компиляцию среды выполнения Razor» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
  10. Нажмите Создать.

Мы будем использовать этот проект для работы с Simple Injector в последующих разделах этой статьи. Теперь выполните шаги, описанные ниже, чтобы создать дополнительные контроллеры в вашем проекте:

  1. Щелкните правой кнопкой мыши папку решения «Контроллеры».
  2. Выберите Добавить -> Контроллер.
  3. В диалоговом окне «Добавить новый шаблонный элемент» выберите API в качестве шаблона (по умолчанию будет выбран MVC).
  4. Выберите пункт «API-контроллер с действиями чтения/записи».
  5. Нажмите Добавить.
  6. В диалоговом окне «Добавить новый элемент», показанном ниже, укажите имя для вашего нового контроллера.
  7. Нажмите Добавить

Установите пакет 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 выдаст исключение, если в указанной вами конфигурации есть какая-либо ошибка.

Related Posts

Оставить комментарий