Asp.net 코어를 사용한 샘플 예
녹화된 영상 링크: https://www.youtube.com/watch?v=oVj1IHw8GLU
개요OfDI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core는 클래스와 해당 종속성 간에 IoC(제어 반전)를 달성하기 위한 기술인 DI(종속성 주입) 소프트웨어 디자인 패턴을 지원합니다.
IoC 컨테이너를 통해 우리는 다음을 달성할 수 있습니다.
Asp.net 코어에는 IoC 컨테이너에 인터페이스가 내장되어 있습니다.
다음 DI 수명주기는 다음과 같습니다.
ASP.NET Core에는 기본적으로 두 가지 유형의 서비스가 있습니다.
프레임워크 서비스: IApplicationBuilder, IHostingEnvironment, ILoggerFactory 등과 같은 ASP.NET Core 프레임워크의 일부인 서비스입니다.
애플리케이션 서비스: 프로그래머로서 애플리케이션을 위해 생성하는 서비스(사용자 정의 유형 또는 클래스)입니다.
Asp.Net Core MVC 컨트롤러는 생성자를 통해 명시적으로 종속성을 요청합니다. 1. 생성자 주입 2. 메서드 주입(작업 수준) 3. 적절한 주입(지원되지 않음) 4. 뷰 주입
생성자 주입: - 서비스는 생성자 매개변수로 추가되고 런타임은 서비스 컨테이너(IServiceCollection-- DiContainer)에서 서비스를 확인합니다. Servicesa는 일반적으로 비구체 클래스(인터페이스)를 사용하여 정의됩니다.
메소드 주입 : - [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}");
}
}
이제 구체적인 유형 "MyDependency"(startup.cs에서)를 사용하여 "IMyDependency" 서비스를 등록합니다.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
여기서 "IServiceCollection" 인스턴스의 Add() 메서드는 IoC 컨테이너에 서비스를 등록하는 데 사용됩니다. "ServiceDescriptor"는 서비스 유형과 구체적인 구현을 지정하는 데 사용됩니다. 그러면 기본적으로 "Singleton"으로 컨테이너에 서비스가 등록됩니다.
이제 다양한 수명을 가진 서비스를 주입해 보겠습니다.
싱글톤(사용 사례: 상태 서비스를 생성해야 하는 경우):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
일시적(사용 사례: 상태 비저장 서비스를 생성해야 하는 경우):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
범위(사용 사례: 데이터베이스 서비스):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new 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();
}
}