时间:2021-05-19
.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); }}如上,我们自定义的 CustomHostService 需要实现 IHostedService接口,当然,我们可以直接继承 BackgoundService 类。
在实现了 IHostedService 接口后,我们通过 services.AddHostedService<>() 进行注入,或者通过 service.AddTransient<IHostedService,THostedService>() 进入注入。
启动以上项目,我们发现,我们的程序默认的Hosting Environment一直是Production,那么如何修改呢 ??
配置环境变量
在AspNetCore项目中,我们可以通过设置环境变量ASPNETCORE_ENVIRONMENT的值来指定主机环境变量的。而在Generic Host 中暂时没有这一项配置。
如果查看IHostBuilder的扩展,我们会发现以下方法:
new HostBuilder() .UseContentRoot(...) .UseEnvironment(...) ...查看源代码后,我们可以通过ConfigureHostConfiguration()方法将这些配置配置到主机中。
现在我们假设我们以DOTNETCORE_ENVIRONMENT来指定GenericHost的环境。
new HostBuilder().ConfigureHostConfiguration(builder => { builder.AddInMemoryCollection(new Dictionary<string, string> { [HostDefaults.EnvironmentKey] = Environment.GetEnvironmentVariable("DOTNETCORE_ENVIRONMENT"), }) // Nuget:Microsoft.Extensions.Configuration.CommandLine //.AddCommandLine(args) ; }) //...现在让我们打开命令行测试下。设置完成环境变量后我们通过dotnet run 启动程序。查看输出,Host Environment 变成为 Stage
# 设置环境变量$env:DOTNETCORE_ENVIRONMENT='Stage'# 查看环境变量$env:DOTNETCORE_ENVIRONMENT
当然我们也可以通过 commandline 的参数来设置启动的环境变量等值。
在ConfigureHostConfiguration()中使用.AddCommandLine(args)来指定参数。
现在我们可以通过 dotnet run --environment=Development来指定dev环境了,此时我们发现我们终于成功加载appsettings.Development.json中的配置信息了。
使用Autofac来替代默认的 DI
简单认识一下Autofac
一个第三方的依赖注入容器,相对Microsft.Extensions.DependencyInjection使用更加简单方便。
集成到Host中
通过Nuget安装以下两个包
Install-Package AutofacInstall-Package Autofac.Extensions.DependencyInection我们可以使用UseServiceProviderFactory()和service.AddAutofac() 将默认的DI 替换成 Autofac;
使用ConfigureContainer<ContainerBuilder>()可以使用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())//...略总结
个人认为出现GenericHost解决的几个痛点,相对AspNetCore中的管道机制,控制台程序如果不依靠GenericHost来管理Di,想进行大量Microsoft.Extensions包的集成会非常困难。通过IHostedService,可以方便的进行服务的托管。
以上就是使用Generic-Host的方法的详细内容,更多关于使用Generic-Host的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
在上一篇文章中,我们已经学习了如何在ASP.NETCore中使用HttpClient从WebAPI获取数据。此外,我们还学习了如何使用GetAsync方法和Ht
问题如何在ASP.NETCore2.0中使用Razor引擎来创建视图?答案新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件:publicvo
VirtualBox的host-only网络使用Host-only可以在VirtualBox中可以建立一个内部的局域网,而且还可以使得主机可以SSH连接虚拟机系
C#中如何定义全局变量及在各窗体中使用全局变量。usingSystem;usingSystem.Collections.Generic;usingSyste
如何在易语言中使用类型库如何在易语言中使用类型库,我们下面用一个小例程来说明,首先打开“易语言”选择“工具”→“类型库及OCX组件—〉支持库”注册word类型库