7가지 의존성 주입 ASP.NET 코어 애플리케이션

19327-20200323085612647-219130351ASP.NET 코어 프레임 워크 많은 코어 객체 같은 애플리케이션, 미들웨어, 객체, ASP.NET MVC 코어 애플리케이션 뷰 컨트롤러 객체 및 다른 목적을 초기화하기 시작 개체로서 사출 종속의 방법으로 제공된다 이미 등록 된 소비자에게 서비스의 형태로 주입 할 때 우리는 그들을 정의 할 수 있습니다. 다음은 몇 가지 서비스 주입에 대한 간단한 시나리오입니다. "ASP.NET 코어 3 프레임 워크 비밀"책뿐만 아니라 5 % 할인에서이 문서 발췌 지난 이틀 의 2 차원 코드, 또는에서 바로 스캔 할 수 있습니다 관심이 여기에 그룹 구매로합니다. .

먼저 분사식 생성자 시동

두 가지 핵심 구성 HostBuilderContext 콘텍스트 객체 (표현 구성 IConfiguration이 호스트 환경을 나타내는 개체 IHostEnvironment는 객체) 바로 소비 시작 생성자에 주입 될 수있다. ASP.NET 코어 애플리케이션 호스팅 환경 IWebHostEnvironment 인터페이스에 의해 표현되기 때문에, 인터페이스 IHostEnvironment IWebHostEnvironment 인터페이스 켜져 그것은 주입도 가능 IWebHostEnvironment가 현재 베어러 모드 개체와 관련된 환경 정보를 획득.

우리는 생성자 시작에 대한 유효성을 주입에 대한 간단한 예를 통해 할 수 있습니다. 다음의 코드는 우리가 시작 <TStartup>에있어서 등록 된 사용자 정의 형 시작 IWebHostBuilder 인터페이스를 호출한다. 시작 유형을 정의 할 때, 우리는 생성자에있는 3 개 개의 객체를 주입, 디버그 주장은 세 개의 객체가 보여 NULL이 아닌 입증되지 제공 사실의 하나의 동일한 인스턴스에서 있었다 IHostEnvironment IWebHostEnvironment 인터페이스 및 커넥터의 사용.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder () ConfigureWebHostDefaults (빌더. => builder.UseStartup <시작> ()) 
        .Build () 
        .RUN (); 
    } 
} 

공용  클래스 시작 
{ 
    공개 시작 ( IConfiguration 구성 IHostEnvironment hostingEnvironment, IWebHostEnvironment webHostEnvironment ) 
    { 
        Debug.Assert (구성 ! = null의 ); 
        Debug.Assert (hostingEnvironment ! = null이 );
        Debug.Assert (webHostEnvironment ! = null이 ); 
        Debug.Assert (ReferenceEquals (hostingEnvironment, webHostEnvironment)); 
    } 
    공공  무효 구성 (IApplicationBuilder 응용 프로그램) {} 
}

둘째, 사출 공정 시동 구성 입력

종속 서비스는 미들웨어의 등록을위한 구성 방법에 직접 주입 될 수있다. 주입 생성자 주입은 또한 서비스의 선택을 할 수 있다면, 구성에있어서, 등록 서비스들의 ConfigureServices 방법 IHostBuilder, IWebHostBuilder 및 시작 호출을 포함하여 포함하여 주입 할 수있는 임의의 수단에 의해 등록 서비스 모든 서비스의 자체 등록의 프레임 워크.

다음 코드는 코드의 단편, 우리는 IFoo IBar 인터페이스 시작 두 서비스 구성 직접 주입 방식에 대한 등록 및 서비스 인터페이스 IWebHostBuilder 시작 ConfigureServices 방법 각각 부른다. 또한, 구성 방법은 IApplicationBuilder 인수로 사용되는 미들웨어를 등록하지만, 매개 변수가 나타나는 위치에 대한 제한을하지 않았다 제공하는 객체를 필요로한다.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder (). ConfigureWebHostDefaults (빌더 => 빌더 
            .UseStartup <시작> () 
            .ConfigureServices (SVC가 => svcs.AddSingleton <IFoo, 푸> ())) 
        .Build () 
        .운영(); 
    } 
} 

공용  클래스 시작 
{ 
    공개  공극 ConfigureServices (IServiceCollection 서비스) => services.AddSingleton <IBar, 바> ();
    공공  무효 구성 (IApplicationBuilder 앱IFoo의 foo는, IBar 바 ) 
    { 
        Debug.Assert (foo에 ! = null이 ); 
        Debug.Assert (바 ! = null이 ); 
    } 
}

세 미들웨어에서 분사식 생성자

가장 중요한 객체 ASP.NET 핵심 미들웨어 요청 처리 파이프 라인은 실제로 요청을 처리하는 데 사용됩니다. ASP.NET 코어 객체의 생성 미들웨어 그들이 전체 요청 처리 파이프 라인의 활용도를 구축하기 때문에, 등록 서비스는 미들웨어 타입 생성자로 주입 될 수 있도록 모든 서비스에 이미 등록되어있다. 코드는 다음과 같습니다 주입 생성자의 미들웨어 유형을 반영 니펫.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder (). ConfigureWebHostDefaults (빌더 => 빌더 
            .ConfigureServices (SVC를 => 으로 SVC 
                .AddSingleton <FoobarMiddleware> () 
                .AddSingleton <IFoo, 푸> () 
                .AddSingleton <IBar, 바 > ()) 
            .Configure (APP => app.UseMiddleware <FoobarMiddleware> ())) 
        .Build () 
        .RUN (); 
    } 
} 

공용  클래스FoobarMiddleware : IMiddleware 
{ 
    공공 FoobarMiddleware ( IFoo의 foo는, IBar 바 ) 
    { 
        Debug.Assert (foo에 ! = null이 ;) 
        Debug.Assert (바 ! = null이 ); 
    } 

    공공 작업 InvokeAsync (HttpContext를 문맥, RequestDelegate 다음) 
    { 
        Debug.Assert (다음 ! = null이 );
        반환 Task.CompletedTask을; 
    } 
}

넷째, 중간 분사식 호출 / InvokeAsync 방법

미들웨어 타입 합의 방법에 기초하여 정의되는 경우, 서비스는 직접 주입 InvokeAsync 호출 법 실제 요청을 처리하는 방법을 등록 할 수있다. 또한, 방법은 더 줄 TAP (작업 기반 비동기 패턴) 프로그래밍 모드 InvokeAsync라는 주로 버전 호환성 목적은 Invoke 메소드 이름을 유지하는 이유. 코드 보여주는 아래 InvokeAsync 주입 방법에 대한 서비스를 보여 니펫.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder (). ConfigureWebHostDefaults (빌더 => 빌더 
            .ConfigureServices (SVC를 => 으로 SVC 
                .AddSingleton <IFoo, 푸> () 
                .AddSingleton <IBar, 바> ()) 
            .Configure ( 앱 => app.UseMiddleware <FoobarMiddleware> ())) 
        .Build () 
        .RUN (); 
    } 
} 

공용  클래스 FoobarMiddleware 
{ 
    개인  읽기 전용 RequestDelegate의 _next;

    공개 FoobarMiddleware (RequestDelegate 다음) => = _next 다음;
    공공 작업 InvokeAsync (HttpContext를 문맥, IFoo의 foo는, IBar 바 ) 
    { 
        Debug.Assert (문맥 ! = null이 ); 
        Debug.Assert (foo에 ! = null이 ); 
        Debug.Assert (바 ! = null이 );
        반환 (컨텍스트) _next; 
    } 
}

미들웨어 형태의 합의 된 정의와 시작 유형이 유사한 서비스 주입 방법, 그들은 모두 지원 생성자 주입 및 주입 방법을 사용하지만, 그들 사이에 약간의 차이가 있지만. 미들웨어 타입 생성자, 방법은 시작 유형을 구성하고 입력 RequestDelegate, IApplicationBuilder HttpContext를 그리고, 전체 목록 매개 변수에이 위치에 대한 전방이다 InvokeAsync 호출 법, 필요한 매개 변수를 갖는 방법을 입력 미들웨어 어느 쪽만을 요구하는 제한을 할 수 없다는 제 파라미터와 현재 요청 컨텍스트 파라미터 HttpContext를해야하는 방법. 위의 규칙에 따르면,이 FoobarMiddleware 미들웨어 유형을 다음과 같이 정의되어 법적 아니라, Starup 유형 정의는 유효합니다. 이 때문에,이 제한은 미들웨어 타입의 정의뿐만 아니라, 더 유연되도록 개방 될 수 있지만, 또한 일관성 주입법을 보장하는 것으로 판단된다.

공공  클래스 FoobarMiddleware 
{ 
    공공 FoobarMiddleware (RequestDelegate 다음);
    공공 작업 InvokeAsync (IFoo의 foo는, IBar 바, HttpContext를 컨텍스트); 
} 

공용  클래스 시작 
{ 
    공공  무효 구성 (IFoo의 foo는, IBar 바, IApplicationBuilder 응용 프로그램); 
}

주입에 필수적인 차이는 소정의 방식에 기초하여 미들웨어 및 생성자 주입 존재한다. 이 미들웨어로 등록되어 있기 때문에 싱글 객체 있으므로 생성자에 주입되지 않아야 범위가 지정된 서비스. 범위의 미들웨어 서비스 만 InvokeAsync 주입 프로세스를 입력 할 수 와 현재의 요청에 제공된 다양한 서비스에 대한 종속 서비스는, 그 범위의 현재의 서비스 요구 처리가 끝난 후에 발매 확보 할 수있다.

V. 분사형 생성자 컨트롤러

MVC는 ASP.NET 코어 애플리케이션에서는 컨트롤러에 정의 된 서비스 주사 주입 방식 생성자있다. 아래의 코드 단편에서는 IFoobar 서비스 생성자 HomeController 주입한다.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder (). ConfigureWebHostDefaults (빌더 => 빌더 
            .ConfigureServices (SVC를 => 으로 SVC 
                .AddSingleton <IFoobar,는 foobar> () 
                .AddSingleton <IBar, 바> () 
                .AddControllersWithViews () ) 
            .Configure (APP => 
                .UseRouting () 
                .UseEndpoints (종점 => endpoints.MapControllers ()))) 
        .Build () 
        .RUN (); 
    } 
}

공용  클래스 HomeController : 컨트롤러 
{ 
    공공 HomeController ( IFoobar는 foobar ) => Debug.Assert (!는 foobar = null이 ); 

}

여섯 번째로, 컨트롤러의 동작의 주사 방법

파라미터 바인딩 바인딩 메카니즘에 기초한 코어 ASP.NET MVC 모델에 의해, 우리는 액션의 의존성 주입 방식을 실현 시키도록, 동작 방법 파라미터 표적에 결합 된 서비스를 등록 할 수있다. 주입 방법의 종류를 사용하는 경우에는 주입 파라미터에 대한 다음과 같은 방식으로 표시해야 FromServicesAttribute에 등록 된 서비스 바인딩 소스 매개 변수를 결정하는 특성.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder (). ConfigureWebHostDefaults (빌더 => 빌더 
            .ConfigureServices (SVC를 => 으로 SVC 
                .AddSingleton <IFoobar,는 foobar> () 
                .AddControllersWithViews ()) 
            .Configure (응용 프로그램 => 응용 프로그램 
                . () UseRouting 
                .UseEndpoints (종점 => endpoints.MapControllers ()))) 
        .Build () 
        .RUN (); 
    } 
} 

공용  클래스HomeController : 컨트롤러 
{ 
    [HttpGet ( " / " )]
     공중  공극 지수 ( [FromServices] IFoobar는 foobar ) 
    { 
        Debug.Assert (는 foobar ! = null의 ); 
    } 
}

일곱 뷰 주입

ASP.NET 코어 MVC 응용 프로그램에서, 우리는 또한 지금보기의 서비스에 등록 할 수 있습니다. 우리는 다음과 같은 간단한 MVC 프로그램을 정의한다고 가정하고, 간단한 HomeController를 정의합니다.

클래스 프로그램 
{ 
    정적  무효 메인 () 
    { 
        Host.CreateDefaultBuilder (). ConfigureWebHostDefaults (빌더 => 빌더 
            .ConfigureServices (SVC를 => 으로 SVC 
                .AddSingleton <IFoobar,는 foobar> () 
                .AddControllersWithViews ()) 
            .Configure (응용 프로그램 => 응용 프로그램 
                . () UseRouting 
                .UseEndpoints (종점 => endpoints.MapControllers ()))) 
        .Build () 
        .RUN (); 
    } 
} 

공용  클래스HomeController : 컨트롤러 
{ 
        [HttpGet ( " / " )]
         공공 IActionResult 지수 () => 보기 (); 
}

우리는 루트에 라우팅 경로를 정의하기 전에 ( "/") 액션 인덱스의 방법은 HomeController, 기본보기보기 메소드 호출에 제시된 방법이의는 ViewBag 양식으로보기에 IFoo 서비스 제공을 주입. 코드는, 액션 뷰 (/Views/Home/Index.cshtml)의 정의 방법이 대응하고, 우리는 foobar에 IFoobar 서비스 명령과 속성 이름 @Inject 통해 주입 아래에서이 수단이 도시 니펫 현재 뷰 객체 부동산 FOOBAR 참조 주입 서비스를 추가 할 수 있습니다.

@Inject IFoobar는 foobar 
@ 
{ 
    Debug.Assert (는 foobar ! = null이 ); 
}

추천

출처www.cnblogs.com/artech/p/di-in-asp-net-core-3.html