快速了解如何在.NETCORE中使用Generic-Host建立主机

2020-05-29 22:00:17于丽

.NETCORE 中的 Generic Host

本文以自己在工作中学习和使用.net core generic-host 作一个总结。

前言

在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWebHostBuild创建了一个IWebHost,而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建WebHost

常常我们的需求不需要创建Web项目,比如后台任务,那么我们如何像使用AspNetCore一样创建控制台项目。

如何在控制台程序中创建主机

通过dotnet new console 创建一个控制台项目

通过Nuget添加以下包

Microsoft.Extensions.Hosting

首先,我们看下IHostBuilder接口里的方法

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);
}

ConfigureAppConfiguration() 可以配置应用的一些配置,如环境变量等等

ConfigureContainer() & UseServiceProviderFactory() 可以配置替换默认的依赖注入的组件,比如替换成Autofac

ConfigureHostConfiguration() 可以配置IConfiguration

ConfigureServices() 可以注入服务

接下去,通过以下代码,我们可以构建一个简单的主机。

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);
 }

}