ASP.NET 코어 MVC 컨트롤러는 일부의 경우, 하나의 컨트롤러는 이해가되지 수있는 컨트롤러 수준의 서비스 요청을 운영해야 할 수 있습니다, 생성자를 명시 적 의존 관계를 통해이를 요청해야합니다. 이 경우에, 또한 처리의 파라미터로서 제공 할 수있다.
의존성 삽입은 의존 관계 역전 원칙은, 느슨하게 결합 된 애플리케이션 모듈 조성물 있도록 도시 된 바와 같은 방법이다.
1. 생성자 삽입
ASP.NET 코어는 MVC 컨트롤러 확장 기반 생성자 의존성 사출 서포트 내장. 생성자 컨트롤러에 매개 변수로 만 서비스 유형을 추가함으로써, ASP.NET 핵심 서비스 컨테이너는이 유형을-해결 내장 사용하려고 시도합니다. 서비스 인터페이스 정의를 사용하여 (항상은 아니지만) 보통이다. 예를 들어, 애플리케이션 대신에 하드 코딩 의존성 주입의 서비스 탐색 시간을 정의하는 경우 :
정의하고 인터페이스를 구현 :
네임 스페이스 MVCTest.Services { 공용 인터페이스 IDateTime { 날짜 시간 이제 { 얻을 ; } } 공용 클래스 SystemDateTime : IDateTime는 { 공공 날짜 시간 지금 { 얻을 { 반환 DateTime.Now을; } } } }
ConfigureServices에서 컨테이너에 서비스를 등록 :
services.AddTransient <IDateTime, SystemDateTime> ();
컨트롤에있어서
공공 클래스 DateTimeController : 컨트롤러 { 개인 IDateTime _dateTime; 공개 DateTimeController (IDateTime dateTime으로) { _dateTime = dateTime으로; } // GET : 날짜 시간 공공 ActionResult 지수 () { var에 serverTime = _dateTime.Now; 경우 (serverTime.Hour < 12 ) { 을 ViewData [ " 메시지 " = " 굿모닝 " ; } 반환 ) (보기; } }
ASP.NET 코어가 내장 된 서비스 요청의 의존성 주입 형에 대한 지원이 하나의 생성자를 가질 수 있습니다, 하나 개 이상의 예외 경우보고됩니다. 기본 의존성 주입을 대체 할 제 3자를 이용하여 구현, 여러 생성자를 지원하도록 구현 될 수있다.
2. 동작 주입 FromServices
때로는 필요하지 컨트롤러에서 동작하는 복수의 서비스를 제공합니다. 이 경우, 운영 주사의 방법으로 서비스 파라미터는 중요하다. [FromServices] 마크 파라미터에 의해 달성 :
공개 ActionResult 지수 ([FromServices] IDateTime _dateTime) { VAR serverTime = _dateTime.Now; 경우 (serverTime.Hour < 12 ) { 을 ViewData [ " 메시지 " = " 굿모닝 " ; } 반환 )보기 (; }
3. 액세스는 제어기에 제공된다
컨트롤러에서 응용 프로그램 설정에 액세스하거나 일반 설정 모드를 구성합니다. 이 액세스 모드는 구성에 설명 된 액세스에 사용되어야한다. 의존성 주입은 일반적으로 제어기로부터 요청이 제공되도록해야하는 더 나은 방법 iOptions에 <T> 인스턴스를 요청하고, T는 구성의 바람직한 형태이다. 예를 들면 :
옵션 범주 만들기 :
공공 클래스 AppSettingOptions { 공공 DefaultConnec의 ConnectionStrings { 얻을 ; 설정 ; } 공공 문자열 AllowedHosts { 얻을 ; 설정 ; } } 공용 클래스 DefaultConnec { 공공 문자열 DefaultConnection { 얻을 ; 설정 ; } }
appsettings.json :
{ " ConnectionStrings " : { " DefaultConnection " : " 데이터 원본 =; 초기 카탈로그 테스트, 통합 보안 = TRUE " }, " 로깅 " : { " LogLevel에 " : { " 기본 " : " 정보 " } }, " AllowedHosts " : " * " }
응용 프로그램 모델을 구성 할 수있는 옵션을 구성 클래스는 서비스 컨테이너를 ConfigureServices을에 추가합니다 :
공개 시작 (IConfiguration 구성 IHostingEnvironment의 ENV) { // 구성 = 구성; var에 빌더 = 새 ConfigurationBuilder () .SetBasePath (Directory.GetCurrentDirectory ()) (.AddJsonFile " appsettings.json " : 옵션, 사실 reloadOnChange : 사실 ) // ". appSettings는 {env.EnvironmentName} .json".AddJsonFile ($ 선택 사항 : TRUE) ; // 配置环境变量 // builder.AddEnvironmentVariables (); 구성 =builder.Build (); } 공공 IConfiguration 구성 { 얻을 ; } // 이 메소드는 런타임에 의해 호출됩니다. 컨테이너에 서비스를 추가하려면이 방법을 사용합니다. 공공 무효 ConfigureServices (IServiceCollection 서비스) { services.AddOptions (); services.Configure <AppSettingOptions> (구성); // 通过代码编写 services.Configure <AppSettingOptions> (옵션 => { options.AllowedHosts = " 테스트 " ; }); }
로서는 appsettings.json로부터 판독 제공되며, 상기 코드에 설치된 첨가 될 수있다.
요구 된 특정 구성 AppSettingOptions 개체의 종류 및 서비스 컨테이너에 추가되면, 그것은 또는 <AppSettingOptions>로서는 iOptions에 요청하는 제어부를 동작하는 방법에 의해 획득 될 수있다 :
공용 클래스 HomeController : 컨트롤러 { 개인 읽기 전용 iOptions에 <AppSettingOptions> _options; 공개 HomeController (iOptions에 <AppSettingOptions> 옵션) { _options의 =의 옵션; } }
설정 위치에 대한 정보를 찾는 방법을 알 필요가 있기 때문에, 설정하고 서로 분리, 구성 및 컨트롤러는 우려의 분리를 다음 있도록 할 수 있습니다 모드 옵션을 따르십시오. 제어기는 클래스 인스턴스가 아닌 직접 따라서 쉽게 제어부 테스트를 사용할 수 있도록, 정적 클래스 설정에 부착하기 때문이다.