'NETCORE'에서 Generic-host 를 사용 하여 호스트 를 만 드 는 방법 을 빠르게 알 아 보기

NETCORE 의 Generic Host
본 고 는 자신 이 업무 중 에.net core generic-host 를 배우 고 사용 하 는 것 으로 요약 한다.
머리말
만 든 ASPNETCORE 프로젝트 에서 우 리 는Main()에서 볼 수 있 습 니 다.우 리 는IWebHostBuild을 통 해IWebHost하 나 를 만 들 었 고 마이크로소프트 는WebHost.CreateDefaultBuilder(args)를 제공 하여 우리 가 더욱 쉽게 만 들 수 있 도록 도와 주 었 습 니 다WebHost.
항상 우리 의 요 구 는 웹 프로젝트,예 를 들 어 배경 작업 을 만 들 필요 가 없습니다.그러면 우 리 는 어떻게 AspNetCore 를 사용 하 는 것 처럼 콘 솔 프로젝트 를 만 듭 니까?
어떻게 콘 솔 프로그램 에서 호스트 를 만 듭 니까?dotnet new console 콘 솔 프로젝트 만 들 기
Nuget 을 통 해 아래 패키지 추가
Microsoft.Extensions.Hosting
우선 인터페이스 에 있 는 방법 을 살 펴 보 자.

public interface IHostBuilder
{
 IHost Build();

 IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate);

 IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate);

 IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate);

 IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate);
 
 IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory);
}
IHostBuilder환경 변수 등 응용 설정 을 설정 할 수 있 습 니 다.ConfigureAppConfiguration()&ConfigureContainer() 기본 의존 주입 구성 요 소 를 바 꿀 수 있 습 니 다.예 를 들 어 Autofac 로 바 꿀 수 있 습 니 다.UseServiceProviderFactory() 설정 가능ConfigureHostConfiguration() IConfiguration서비스 주입 가능
다음 코드 를 통 해 우 리 는 간단 한 호스트 를 구축 할 수 있 습 니 다.

static void Main(string[] args)
{
 CreateDefaultHost(args).Build().Run();
}static IHostBuilder CreateDefaultHost(string[] args) => new HostBuilder()
 .ConfigureHostConfiguration(builder =>
 {  //todo
 })
 .ConfigureAppConfiguration((ctx, builder) =>
 {
  builder
   .SetBasePath(AppContext.BaseDirectory)
   .AddJsonFile("appsettings.json", true, true)
   .AddJsonFile($"appsettings.{ctx.HostingEnvironment.EnvironmentName}.json", true, true)
   .AddEnvironmentVariables()
   ;
 })
 .ConfigureServices((ctx, services) =>
 {
  services.AddLogging();
  services.AddHostedService<CustomHostService>();
 })
 .UseConsoleLifetime()
 ;

public class CustomHostService: IHostedService{ private ILogger _logger; private Task _executingTask; public Task StartAsync(...) {
  _logger.LogInformation($"{nameof(CustomHostService):}start");

  _executingTask = ExecuteAsync(...);  if(_executingTask.IsCompleted){   return _executingTask;
  }  return Task.CompletedTask;
 } public Task StopAsync(CancellationToken cancellationToken) {  return Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken));
 } public Task ExecuteAsync(...) {
  _logger.LogInformation($"{nameof(CustomHostService):executing}")  return Task.Delay(5000);
 }

}
 위 와 같이 우리 가 사용자 정의ConfigureServices() CustomHostService 인 터 페 이 스 를 실현 해 야 한다.물론 우 리 는IHostedService종 류 를 직접 계승 할 수 있다.BackgoundService인 터 페 이 스 를 실현 한 후에 우 리 는 IHostedService 을 통 해 주입 하거나 services.AddHostedService<>() 을 통 해 주입 한다.
이상 의 항목 을 시작 하면 우 리 는 우리 의 프로그램 이 기본service.AddTransient<IHostedService,THostedService>() 으로 계속Hosting Environment되 어 있다 는 것 을 알 게 되 었 습 니 다.그러면 어떻게 수정 합 니까?
환경 변수 설정
AspNetCore 프로젝트 에서 저 희 는 환경 변수Production의 값 을 설정 하여 호스트 환경 변 수 를 지정 할 수 있 습 니 다.Generic Host 에 서 는 이 설정 이 잠시 없습니다.ASPNETCORE_ENVIRONMENT의 확장 을 보면 다음 과 같은 방법 을 발견 할 수 있 습 니 다.

new HostBuilder()
 .UseContentRoot(...)
 .UseEnvironment(...) ...
원본 코드 를 본 후에 우 리 는IHostBuilder방법 으로 이 설정 을 호스트 에 설정 할 수 있 습 니 다.
지금 우 리 는 우리 가ConfigureHostConfiguration()로 GenericHost 의 환경 을 지정 한다 고 가정 합 니 다.

new HostBuilder().ConfigureHostConfiguration(builder =>
 {
  builder.AddInMemoryCollection(new Dictionary<string, string>
  {
   [HostDefaults.EnvironmentKey] = Environment.GetEnvironmentVariable("DOTNETCORE_ENVIRONMENT"),
  })  // Nuget:Microsoft.Extensions.Configuration.CommandLine
  //.AddCommandLine(args) 
  ;
 }) 
 //...
이제 명령 행 을 열 어 테스트 해 봅 시다.환경 변 수 를 설정 한 후 프로그램 을 시작 합 니 다.출력 보기,Host Environment 변환DOTNETCORE_ENVIRONMENT\#환경 변수 설정$env:DOTNETCOREENVIRONMENT='Stage'\#환경 변수 보기$env:DOTNETCOREENVIRONMENT
물론 우 리 는 commandline 의 매개 변 수 를 통 해 시작 하 는 환경 변수 등 값 을 설정 할 수 있 습 니 다.

Install-Package Microsoft.Extensions.Configuration.CommandLine
dotnet run 에서 인 자 를 지정 하기 위해Stage를 사용 합 니 다.
이제 우 리 는ConfigureHostConfiguration()을 통 해 dev 환경 을 지정 할 수 있 습 니 다.이때 우 리 는 마침내.AddCommandLine(args)의 설정 정 보 를 불 러 오 는 데 성공 했다 는 것 을 알 게 되 었 습 니 다.
기본 DI 대신 Autofac 사용 하기
Autofac 를 간단하게 알 아 보 겠 습 니 다.
제3자 의 의존 주입 용 기 는 상대 적 으로dotnet run --environment=Development사용 이 더욱 간단 하고 편리 하 다.
Host 에 통합
Nuget 을 통 해 아래 두 개의 패 키 지 를 설치 합 니 다.

Install-Package Autofac

Install-Package Autofac.Extensions.DependencyInection
기본 DI 를appsettings.Development.jsonMicrosft.Extensions.DependencyInjection로 대체 할 수 있 습 니 다.UseServiceProviderFactory()를 사용 하면 Autofac 를 사용 하여 서 비 스 를 주입 할 수 있 습 니 다.

//        static IHostBuilder CreateDefaultHost(string[] args) => new HostBuilder()//... 
 .ConfigureServices((ctx, services) =>
 {
  services.AddLogging(x=>{x.AddConsole();});

  services.AddAutofac();
 })
 .ConfigureContainer<ContainerBuilder>(builder => 
 {
  builder.RegisterType<CustomHostService>()
  .As<IHostedService>()
  .InstancePerDependency();
 })   
 .UseServiceProviderFactory<ContainerBuilder>(new AutofacServiceProviderFactory())//... 
총결산
개인 적 으로 제 네 릭 호스트 가 해결 하 는 몇 가지 통 증 이 나타 나 는 것 은 AspNetCore 의 파이프라인 메커니즘 에 비해 콘 솔 프로그램 이 제 네 릭 호스트 에 의존 하지 않 고 디 를 관리 하지 않 으 면 대량의service.AddAutofac() 가방 을 통합 하 는 것 이 매우 어 려 울 것 이 라 고 생각한다.IHosted Service 를 통 해 서비스의 위탁 관 리 를 편리 하 게 할 수 있 습 니 다.
이상 은 Generic-host 를 사용 하 는 방법 에 대한 상세 한 내용 입 니 다.Generic-host 를 사용 하 는 것 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기