При работе с внедрением зависимостей и инверсией управления в приложениях 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, выполните действия, описанные ниже.
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальные API)». В этом проекте мы не будем использовать минимальные API.
- В другом месте окна «Дополнительная информация» оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию) и убедитесь, что флажки «Включить поддержку Open API», «Настроить для HTTPS» и «Включить Docker» остаются снятыми. . Мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Мы будем использовать этот проект веб-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 ниже.
Рисунок 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 правильно разрешен в контроллере и доступен в методе действия.
Рисунок 2. Контейнер TinyIoC в действии!
Заключение
Для простоты мы создали минималистическую реализацию контейнера TinyIoC в ASP.NET Core. Вы можете изучить представленные здесь модульные тесты, чтобы узнать больше о том, как можно использовать контейнер TinyIoC. Вы также можете создать свой собственный контейнер IoC. Я рассмотрю это в следующей статье здесь.
Дальше читайте это:
- Облачные вычисления больше не являются пустяком
- Что такое генеративный ИИ? Искусственный интеллект, который создает
- Программирование с помощью ИИ: советы и лучшие практики от разработчиков
- Python пытается удалить GIL и повысить параллелизм
- 7 причин, по которым Java по-прежнему хороша
- Война за лицензирование открытого исходного кода окончена