Пример примера с использованием ядра Asp.net
Ссылка на записанное видео: https://www.youtube.com/watch?v=oVj1IHw8GLU
ОбзорOfDI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core поддерживает шаблон проектирования программного обеспечения внедрения зависимостей (DI), который представляет собой метод достижения инверсии управления (IoC) между классами и их зависимостями.
С помощью IoC-контейнера мы можем достичь
В ядре Asp.net контейнер IoC имеет встроенные интерфейсы.
Следующий жизненный цикл DI будет
В ASP.NET Core есть два типа сервисов:
Службы платформы: службы, являющиеся частью платформы ASP.NET Core, такие как IApplicationBuilder, IHostingEnvironment, ILoggerFactory и т. д.
Службы приложений: службы (настраиваемые типы или классы), которые вы как программист создаете для своего приложения.
Зависимости запроса контроллера Asp.Net Core MVC явно через конструкторы 1. Внедрение конструктора 2. Внедрение метода (уровень действия) 3. Внедрение свойства (не поддерживается) 4. Внедрение представления
Внедрение в конструктор: — Службы добавляются в качестве параметра конструктора, и среда выполнения разрешает службу из контейнера службы (IServiceCollection-- DiContainer). Сервисы обычно определяются с использованием неконкретного класса (интерфейсов).
Внедрение метода: использование атрибута [FromService] позволяет внедрить сервис непосредственно в метод действия без использования внедрения контроллера.
Внедрение свойств В настоящее время (ядро Asp.net) встроенный контейнер IOC не поддерживает внедрение свойств. Для этого вы можете использовать сторонние встроенные сервисные контейнеры (IOC).
Просмотр внедрения с помощью директивы [Inject] позволяет внедрить сервис непосредственно на страницу просмотра без использования контроллера или внедрения метода.
Встроенный контейнер IoC поддерживает три типа времени жизни:
В примере интерфейса службы «IMyDependency» определяется метод «WriteMessage».
public interface IMyDependency
{
void WriteMessage(string message);
}
Этот интерфейс реализован конкретным типом MyDependency:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
Теперь регистрирует службу «IMyDependency» с конкретным типом «MyDependency» (в файле start.cs).
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
Здесь метод Add() экземпляра «IServiceCollection» используется для регистрации службы в контейнере IoC. «ServiceDescriptor» используется для указания типа службы и конкретной реализации. Это зарегистрирует нашу службу в контейнере с именем по умолчанию «Singleton».
Теперь давайте внедрим сервисы с разным временем жизни.
Синглтон (пример использования: когда нам нужно создать государственную службу):
Services.Add(новый ServiceDescriptor(typeof(IMyDependency), новый MyDependency(),ServiceLifetime.Singleton));
Переходный (случай использования: когда нам нужно создать службу без сохранения состояния):
Services.Add(новый ServiceDescriptor(typeof(IMyDependency), новый MyDependency(),ServiceLifetime.Transient));
Область действия (сценарий использования: служба базы данных):
Services.Add(новый ServiceDescriptor(typeof(IMyDependency), новый MyDependency(),ServiceLifetime.Scoped));
Мы также можем внедрить сервисы, используя встроенные методы расширения.
Синглтон
Services.AddSingleton
Переходный процесс
Services.AddTransisent
Область действия
Services.AddScoped
общественный класс HomeController: Контроллер {частный только для чтения IMyDependency _service;
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
публичный класс HomeController: Контроллер {
public IActionResult Index()
{
return View();
}
}
В Index.cshtml
@{ ViewData["Title"] = "Домашняя страница"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
публичный класс HomeController: Контроллер {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}