快速了解如何在.NETCORE中使用Generic-Host建立主机
.NETCORE中的GenericHost
本文以自己在工作中学习和使用.netcoregeneric-host作一个总结。
前言
在创建的ASPNETCORE项目中,我们可以在Main()中看见,我们通过IWebHostBuild创建了一个IWebHost,而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建WebHost。
常常我们的需求不需要创建Web项目,比如后台任务,那么我们如何像使用AspNetCore一样创建控制台项目。
如何在控制台程序中创建主机
通过dotnetnewconsole创建一个控制台项目
通过Nuget添加以下包
Microsoft.Extensions.Hosting
首先,我们看下IHostBuilder接口里的方法
publicinterfaceIHostBuilder { IHostBuild(); IHostBuilderConfigureAppConfiguration(ActionconfigureDelegate); IHostBuilderConfigureContainer (Action configureDelegate); IHostBuilderConfigureHostConfiguration(Action configureDelegate); IHostBuilderConfigureServices(Action configureDelegate); IHostBuilderUseServiceProviderFactory (IServiceProviderFactory factory); }
ConfigureAppConfiguration()可以配置应用的一些配置,如环境变量等等
ConfigureContainer()&UseServiceProviderFactory()可以配置替换默认的依赖注入的组件,比如替换成Autofac
ConfigureHostConfiguration()可以配置IConfiguration
ConfigureServices()可以注入服务
接下去,通过以下代码,我们可以构建一个简单的主机。
staticvoidMain(string[]args) { CreateDefaultHost(args).Build().Run(); }staticIHostBuilderCreateDefaultHost(string[]args)=>newHostBuilder() .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(); }) .UseConsoleLifetime() ;
publicclassCustomHostService:IHostedService{privateILogger_logger;privateTask_executingTask;publicTaskStartAsync(...){ _logger.LogInformation($"{nameof(CustomHostService):}start"); _executingTask=ExecuteAsync(...);if(_executingTask.IsCompleted){return_executingTask; }returnTask.CompletedTask; }publicTaskStopAsync(CancellationTokencancellationToken){returnTask.WhenAny(_executingTask,Task.Delay(Timeout.Infinite,cancellationToken)); }publicTaskExecuteAsync(...){ _logger.LogInformation($"{nameof(CustomHostService):executing}")returnTask.Delay(5000); } }
如上,我们自定义的CustomHostService需要实现IHostedService接口,当然,我们可以直接继承BackgoundService类。
在实现了IHostedService接口后,我们通过services.AddHostedService<>()进行注入,或者通过service.AddTransient
启动以上项目,我们发现,我们的程序默认的HostingEnvironment一直是Production,那么如何修改呢??
配置环境变量
在AspNetCore项目中,我们可以通过设置环境变量ASPNETCORE_ENVIRONMENT的值来指定主机环境变量的。而在GenericHost中暂时没有这一项配置。
如果查看IHostBuilder的扩展,我们会发现以下方法:
newHostBuilder() .UseContentRoot(...) .UseEnvironment(...)...
查看源代码后,我们可以通过ConfigureHostConfiguration()方法将这些配置配置到主机中。
现在我们假设我们以DOTNETCORE_ENVIRONMENT来指定GenericHost的环境。
newHostBuilder().ConfigureHostConfiguration(builder=> { builder.AddInMemoryCollection(newDictionary{ [HostDefaults.EnvironmentKey]=Environment.GetEnvironmentVariable("DOTNETCORE_ENVIRONMENT"), })//Nuget:Microsoft.Extensions.Configuration.CommandLine //.AddCommandLine(args) ; }) //...
现在让我们打开命令行测试下。设置完成环境变量后我们通过dotnetrun启动程序。查看输出,HostEnvironment变成为Stage
#设置环境变量$env:DOTNETCORE_ENVIRONMENT='Stage'#查看环境变量$env:DOTNETCORE_ENVIRONMENT
当然我们也可以通过commandline的参数来设置启动的环境变量等值。
Install-PackageMicrosoft.Extensions.Configuration.CommandLine
在ConfigureHostConfiguration()中使用.AddCommandLine(args)来指定参数。
现在我们可以通过dotnetrun--environment=Development来指定dev环境了,此时我们发现我们终于成功加载appsettings.Development.json中的配置信息了。
使用Autofac来替代默认的DI
简单认识一下Autofac
一个第三方的依赖注入容器,相对Microsft.Extensions.DependencyInjection使用更加简单方便。
集成到Host中
通过Nuget安装以下两个包
Install-PackageAutofac Install-PackageAutofac.Extensions.DependencyInection
我们可以使用UseServiceProviderFactory()和service.AddAutofac()将默认的DI替换成Autofac;
使用ConfigureContainer
//省略了非关键代码staticIHostBuilderCreateDefaultHost(string[]args)=>newHostBuilder()//...略 .ConfigureServices((ctx,services)=> { services.AddLogging(x=>{x.AddConsole();}); services.AddAutofac(); }) .ConfigureContainer(builder=> { builder.RegisterType () .As () .InstancePerDependency(); }) .UseServiceProviderFactory (newAutofacServiceProviderFactory())//...略
总结
个人认为出现GenericHost解决的几个痛点,相对AspNetCore中的管道机制,控制台程序如果不依靠GenericHost来管理Di,想进行大量Microsoft.Extensions包的集成会非常困难。通过IHostedService,可以方便的进行服务的托管。
以上就是使用Generic-Host的方法的详细内容,更多关于使用Generic-Host的资料请关注毛票票其它相关文章!