ASP.NET 코어 기본 사용 의존성 주입

ASP.NET 코어 의존성 삽입 (Dependency Injection)

ASP.NET 코어 층은 골격 의존성 주입을위한 지원을 제공한다. 즉, 의존성 주입을 이해하지 않는 경우, ASP.NET 핵심 개발 모델에 적응하기 어려울 것입니다. 이 문서에서 ASP.NET 코어에 의존성 주입을 사용하는 방법을 보여줍니다 코드와 함께 의존성 주입의 기본 개념을 소개합니다.

의존성 주입은 무엇인가?

의존성 주입 도입 바이두 백과 사전 :

(IOC의 약칭 제어 반전) 제어 반전은 객체 지향 프로그래밍의 한 설계 원리는 컴퓨터 코드 사이의 결합의 정도를 감소시키기 위해 사용될 수있다. 가장 일반적인 방법은 "종속 룩업"(종속성 조회)라는 방법이 의존성 삽입 (DI라고 의존성 주입)이라고한다. 개체가 그것으로 전달 목적을 의존하는 규제 시스템 내의 모든 오브젝트는 외부 엔티티에 의해 생성 된 제어 반전 저자. 이 자기 의존성에 주입되어, 상기 수있다.

설명 백과로부터 알 수있는 바와 같이, 반전 제어 의존성 주입 의존성 삽입 올바르게 사용하여 종래 기술에서, 시스템은, 커플 링의 정도를 감소시킬 수 있으며, 주입 새로운 모델의 설계에 의존 한 것이된다 시스템 확장 성을 증대 섹스.

의 예를 살펴 보자 :

public interface IInterfaceA
{ }

public interface IInterfaceB
{ }

public class ClassA : IInterfaceA
{
    private IInterfaceB B { get; set; }

    public ClassA(IInterfaceB b)
    {
        this.B = b;
    }
}

public class ClassB : IInterfaceB
{ }

우리가 IInterfaceA 인스턴스를 얻으려면 의존성 주입을 사용하지 않는 경우이 시간, 우리의 접근 방식은 다음과 같이 보통 :

IInterfaceB b = new ClassB();
IInterfaceA a = new ClassA(b);

그가 죽은 인스턴스화에있는이 시간 제어 IInterfaceA은, 상상력이 없다 제한되어를 ClassA의 인스턴스이며, 우리가 수동으로 IInterfaceB를 초기화 할 필요가있다, B를 통해 동일한 제어도 사망 제한됩니다. 이 그러한 코드 디자인은 없지만, 또한 확장에 매우 도움이.

의존성 주입하면, 우리는 코드를 보면 :

var a = container.GetService<IInterfaceA>();

IOC의 컨테이너 제어, 우리는 또한 구성 할 수 있기 때문에, 제어 인터페이스 A 및 B는 컨테이너에 의해 제어된다 이번에는, 시스템의 유연성을 확대 용기 구현 다른 인터페이스를 주입 할 수동으로 달성 될 수있는 객체를 생성하는 개체의 수명을 제어하는 ​​유연한 방법.

(공식 웹 사이트에서 사진) 아래 제어 다이어그램의 반전 :
영상

의존성 삽입 ASP.NET 코어

위는 다음 ASP.NET 코어, 우리는 어떻게 의존성 주입을 사용합니까 의존성 주입의 기본 개념을 설명? ASP.NET 핵심은 의존성 주입 컨테이너를 구축하고, 우리는 직접 사용할 수 있습니다.

서비스에 Startup.ConfigureServices를 추가하고 우리가 등록해야 등등 PageModel, 컨트롤러, 뷰가 필요하고 어디에 해당 구성 수명주기 서비스는, 당신이 사용할 수있는 경우 추가 할 수 있습니다 알고 있습니다.

다음은 공식 웹 사이트에서 서비스 코드를 등록하는 방법을 보여줍니다. 우리는 먼저 서비스 인터페이스를 정의하고,이 인터페이스를 구현해야합니다

public interface IMyDependency
{
    Task WriteMessage(string message);
}

public class MyDependency : IMyDependency
{
    private readonly ILogger<MyDependency> _logger;

    public MyDependency(ILogger<MyDependency> logger)
    {
        _logger = logger;
    }

    public Task WriteMessage(string message)
    {
        _logger.LogInformation(
            "MyDependency.WriteMessage called. Message: {MESSAGE}", 
            message);

        return Task.FromResult(0);
    }
}

그런 다음 우리는 서비스 등록을 수행 :

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyDependency, MyDependency>();
    services.AddMvc();
}

여기에서 우리는 등록 된 IMyDependency를 추가 할뿐만 아니라, MVC 등록이 필요한 서비스의 사용을 추가했다. 주목해야한다 두 가지 문제가 있습니다 :

  • AddScoped가 서비스 레지스트리를 추가하는 것입니다, 서비스의 범위가 지정된 수명주기, 서비스의 범위는 객체를 생성하기 위해, 여러 번 사용하는 경우, 서비스를 만드는 역할을 표현. 예를 들어, 각각의 HTTP 요청은 그 요청 프로세스 컨테이너 객체를 만들 것이다 범위이다. 범위가 지정된으로 대응하는 다른 라이프 사이클, 우리는 다음과 같습니다 수명을 제공합니다 있습니다 :

    • 과도 : 순간 서비스, 새로운 객체가 생성 될 때마다 나타냅니다
    • 범위 : 서비스의 범위는 단지 하나의 오브젝트는 각각의 요청에 대해 생성 나타낸다. 미들웨어가 필수 싱글이기 때문에 당신이이 제약에 따라 서비스 미들웨어없는 경우는 특별 지시해야한다. 당신이 범위가 지정된 서비스 미들웨어를 사용하는 경우, 당신은 서비스 매개 변수 또는 InvokeAsync 호출 방법에 주입 할 필요가, 당신은 참조 할 수있는 ASP.NET 핵심 미들웨어 기본적인 사용법을
    • 싱글 : 싱글 서비스는 각 응용 프로그램 도메인이 힘을 만드는 것을 나타냅니다.
  • 계약을 바탕으로, ASP.NET 핵심은 우리가 비슷한 사용하는 것이 좋습니다 Add{SERVICE_NAME}다음과 같은 services.AddMvc (),이 방법은 확장 방법에 의해 달성 될 수 등 등록 서비스를 추가하는 방법을 :
namespace Microsoft.Extensions.DependencyInjection
{
    public static partial class MyDependencyExtensions
    {
        public static IServiceCollection AddMyDependency(this IServiceCollection services)
        {
            return services.AddScoped<IMyDependency, MyDependency>();
        }
    }
}

의존성 주입을 사용하여

의존성 주입의 기본적인 사용법을 이해 한 후, 우리는 지금 서비스, 뷰의 컨트롤러에 주입하는 방법을 살펴 봅니다.

서비스 제어기 주입

가장 일반적인 사용 생성자 주입 방식을 사용하는 다음과 같은 서비스 제어기에 주입한다 :

public class DefaultController : Controller
{
    private readonly ILogger<DefaultController> logger;

    public DefaultController(ILogger<DefaultController> logger)
    {
        this.logger = logger;
    }
}

생성자 주입이 방법이 의존 public 생성자를 제공해야합니다, 가장 일반적으로 사용되는 주입 방법이며, 항목 의존 중독자는 생성자의 방법, 할당 완료 의존성에 의해 전달.

또한,도 주입 파라미터에 의해 상기 의존성을 사용한 작업으로 주입 FromServices의 특성 :

public IActionResult Index([FromServices]ILogger<DefaultController> logger)
{
    throw new NotImplementedException();
}

ASP.NET 핵심은이 지원을 제공하지만 저자는이 작업을하지 않는 것이 좋습니다

뷰에서 사출 서비스

다음 ASP.NET 노심지지 의존성보기 주입 :

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@{
   string myValue = Configuration["root:parent:child"];
   ...
}

상기 코드는 도면에 배치 판독 기능을 달성하기 위해, 도면에 주입 서비스 IConfiguration를 나타낸다.

때때로 서비스에 유용합니다 (예를 들어, 로컬 리 제이션) 될 뷰에 주입되어 있지만, 이렇게하면 국경 뷰와 컨트롤러가 명확하지 않다 발생할 가능성이 있기 때문에 저자는 매우 권장되지 않습니다.

PageModel에서 서비스를 주입

PageModel 방법 주사 서비스 제어부에 주입 서비스 방식 등 :

public class IndexModel : PageModel
{
    private readonly IMyDependency _myDependency;

    public IndexModel(IMyDependency myDependency)
    {
        _myDependency = myDependency;
    }
}

main 메소드에서 서비스에 액세스

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var serviceScope = host.Services.CreateScope())
    {
        var services = serviceScope.ServiceProvider;

        try
        {
            var serviceContext = services.GetRequiredService<MyScopedService>();
            // Use the context here
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred.");
        }
    }

    host.Run();
}

HttpContext.RequestServices에서 서비스에 액세스

이 방식은 사용하지 않는 것이 좋습니다 시험에 도움이되지 않습니다.

우선 순위 서비스를 수동으로 접근의 필요성을 피하기 위해 생성자 주입을 통해 서비스,하지만 때로는 어려운를 얻을 수있을 것입니다하지만 서비스에 대한 액세스에 손을-사용하는 경우, 우리는 HttpContext.RequestServices에서 받아야합니다.

타사 의존성 주입 프레임 워크를 사용하여

제한 ASP.NET 코어가 내장 된 기능 의존성 주입 프레임 워크, 우리는 타사 프레임 워크의 특성을 사용하고자 할 때, 우리는 기본 의존성 주입 프레임 워크를 교체 할 수 있습니다.

내장 프레임 의존성 ASP.NET 코어 주입 특성이 포함되지 않는다 :

  • 속성 주입
  • 사출 이름을 기반으로
  • 자식 용기
  • 사용자 라이프 사이클 관리
  • 객체의 초기화 지연에 대한 FUNC 지원

우리는 이러한 기능을 사용하는 경우, 우리는 타사 프레임 워크를 사용할 수 있습니다. 본 논문에서는 공식 문서 Autofac 프레임 워크에서.

  • 먼저 Autofac, Autofac.Extensions.DependencyInjection 참조를 추가
  • Startup.ConfigureServices 컨테이너에 배치하고, IServiceProvider를 반환합니다. 타사 컨테이너를 사용하면 IServiceProvider를 반환해야합니다.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    // Add other framework services

    // Add Autofac
    var containerBuilder = new ContainerBuilder();
    containerBuilder.RegisterModule<DefaultModule>();
    containerBuilder.Populate(services);
    var container = containerBuilder.Build();
    return new AutofacServiceProvider(container);
}
  • 구성 모듈 Autofac, 사용 등록 서비스
public class DefaultModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<CharacterRepository>().As<ICharacterRepository>();
    }
}

참고 자료

추천

출처www.cnblogs.com/youring2/p/10926590.html