코어 ASP.NET MVC의 종속성 분사 제어 장치

  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의 =의 옵션; 
        } 
}

  설정 위치에 대한 정보를 찾는 방법을 알 필요가 있기 때문에, 설정하고 서로 분리, 구성 및 컨트롤러는 우려의 분리를 다음 있도록 할 수 있습니다 모드 옵션을 따르십시오. 제어기는 클래스 인스턴스가 아닌 직접 따라서 쉽게 제어부 테스트를 사용할 수 있도록, 정적 클래스 설정에 부착하기 때문이다.

 

 

 

 

추천

출처www.cnblogs.com/afei-24/p/11367425.html