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

автор vadim


При работе с внедрением зависимостей и инверсией управления в приложениях ASP.NET Core вам часто может потребоваться простой или легкий контейнер IoC, чтобы избежать ненужной сложности или ненужных накладных расходов. Большинство контейнеров IoC потребляют много ресурсов, что не идеально, если в вашем приложении не нужен полноценный контейнер IoC.

В этой статье мы обсудим концепции инверсии управления и внедрения зависимостей, а также представим TinyIoC, контейнер IoC, который является одновременно простым и легким. Затем мы продемонстрируем, как можно работать с TinyIoC в приложениях ASP.NET Core.

Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Инверсия управления и внедрение зависимостей

Архитектурные шаблоны инверсии управления (IoC) и внедрения зависимостей (DI) помогают повысить модульность, тестируемость и удобство обслуживания вашего приложения. IoC — это шаблон проектирования, который позволяет отделять компоненты, заменять реализации зависимостей и облегчать тестирование. DI является подмножеством принципа IoC и служит одним из методов реализации IoC. Помимо DI, существует несколько альтернативных методов реализации IoC, таких как события, делегаты, шаблоны шаблонов, фабричные методы и локаторы сервисов.

В следующих разделах мы рассмотрим, как можно работать с TinyIoC в ASP.NET Core. Прежде чем мы начнем, давайте создадим новый проект веб-API ASP.NET Core в Visual Studio. Мы будем использовать этот проект в последующих разделах этой статьи.

Создайте проект веб-API ASP.NET Core в Visual Studio 2022.

Чтобы создать проект веб-API ASP.NET Core в Visual Studio 2022, выполните действия, описанные ниже.

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

Мы будем использовать этот проект веб-API ASP.NET Core для работы с TinyIoC в разделах ниже.

Установите пакет NuGet TinyIoC.

Затем добавьте пакет NuGet TinyIoC в проект веб-API, который вы только что создали в Visual Studio. Выберите проект в окне обозревателя решений, щелкните правой кнопкой мыши и выберите «Управление пакетами NuGet». В окне диспетчера пакетов NuGet найдите пакет TinyIoC и установите его.

Кроме того, вы можете установить пакет TinyIoC через консоль диспетчера пакетов NuGet, введя строку, показанную ниже.

PM> Install-Package TinyIoC

Поскольку мы работаем с .NET Core, нам следует использовать NuGet-пакет TinyIoC Release Candidate. Вам следует установить флажок «Включить предварительную версию» в окне «Управление пакетами NuGet…» и установить последнюю версию пакета NuGet TinyIoC RC, как показано на рисунке 1 ниже.

крошечный 01 ИДГ

Рисунок 1. Установка TinyIoC RC для ASP.NET Core.

Создайте минималистичный класс в ASP.NET Core.

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

using System.Diagnostics;
namespace TinyIoC_Demo
{
    public class MyService : IMyService
    {
        public string MyMethod()
        {
            Trace.WriteLine("Inside MyMethod()");
            return "Hello World";
        }
    }
}

Интерфейс IMyService содержит объявление метода MyMethod.

namespace TinyIoC_Demo
{
    public interface IMyService
    {
        public string MyMethod();
    }
}

Настройка контейнера TinyIoC в ASP.NET Core

Чтобы зарегистрировать сервисы с помощью контейнера TinyIoC в ASP.NET Core, вам следует написать следующий фрагмент кода в файле Program.s проекта, который мы создали ранее.

TinyIoCContainer.Current.Register<IMyService, MyService>().AsSingleton();

Если у вас есть несколько зависимостей для регистрации в контейнере, вы можете записать их внутри метода, а затем вызвать его здесь один раз, чтобы убедиться, что код чист.

internal static class Bootstrap
{
    internal static void RegisterDependencies()
    {
        TinyIoCContainer.Current.Register
         <IMyService, MyService>().AsSingleton();
        //Write code here to register the other services
    }
}

Теперь вы можете вызвать метод RegisterDependities класса Bootstrap, чтобы зарегистрировать службы во встроенном контейнере среды выполнения ASP.NET Core, как показано ниже.

Bootstrap.RegisterDependencies();

При необходимости вы можете указать имя при регистрации службы в контейнере, как показано в приведенном ниже фрагменте кода.

var myServiceInstance = new MyService();
TinyIoCContainer.Current.Register<IMyService>(myServiceInstance, "MyService");

Полный исходный код Program.cs

Полный исходный код файла Program.cs приведен ниже для справки.

using TinyIoC;
using TinyIoC_Demo;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
Bootstrap.RegisterDependencies();
builder.Services.AddControllers();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseAuthorization();
app.MapControllers();
app.Run();
internal static class Bootstrap
{
    internal static void RegisterDependencies()
    {
        TinyIoCContainer.Current.Register
         <IMyService, MyService>().AsSingleton();
        //Write code here to register the other services
    }
}

Разрешение зависимостей в ASP.NET Core

После того как зависимости зарегистрированы и добавлены в контейнер, вы сможете получить зависимости в своем приложении и использовать их для вызова методов. Чтобы разрешить зависимости, вы можете использовать метод Resolve класса TinyIoCContainer, как показано в приведенном ниже фрагменте кода.

var _myService = TinyIoCContainer.Current.Resolve<IMyService>();

Обратите внимание, как был передан тип для извлечения соответствующего типа объекта из контейнера. Теперь вы можете использовать этот экземпляр (с именем _myService) для вызова методов, относящихся к интерфейсу IMyService.

Создайте контроллер API в ASP.NET Core.

Создайте новый контроллер API и замените сгенерированный исходный код следующим листингом кода.

using Microsoft.AspNetCore.Mvc;
using TinyIoC;
namespace TinyIoC_Demo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TinyIOCDemoController : ControllerBase
    {
        private readonly IMyService _myService;
        public TinyIOCDemoController()
        {
            _myService = TinyIoCContainer.Current.Resolve<IMyService>();
        }
        [HttpGet]
        public ActionResult Get()
        {
            return Ok(_myService.MyMethod());
        }
    }
}

Когда вы установите точку останова в методе действия HttpGet и запустите приложение, вы увидите, что экземпляр типа IMyService правильно разрешен в контроллере и доступен в методе действия.

крошечный 02 ИДГ

Рисунок 2. Контейнер TinyIoC в действии!

Заключение

Для простоты мы создали минималистическую реализацию контейнера TinyIoC в ASP.NET Core. Вы можете изучить представленные здесь модульные тесты, чтобы узнать больше о том, как можно использовать контейнер TinyIoC. Вы также можете создать свой собственный контейнер IoC. Я рассмотрю это в следующей статье здесь.

Дальше читайте это:

  • Облачные вычисления больше не являются пустяком
  • Что такое генеративный ИИ? Искусственный интеллект, который создает
  • Программирование с помощью ИИ: советы и лучшие практики от разработчиков
  • Python пытается удалить GIL и повысить параллелизм
  • 7 причин, по которым Java по-прежнему хороша
  • Война за лицензирование открытого исходного кода окончена

Related Posts

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