这篇文章主要介绍了如何在NETCORE。中使用通用主机建立主机,文中代码非常详细,可供大家参考,感兴趣的朋友不妨阅读完
.NETCORE 中的 Generic Host
本文以自己在工作中学习和使用。网络核心通用主机作一个总结。
前言
在创建的ASPNETCORE项目中,我们可以在主()中看见,我们通过IWebHostBuild创建了一个IWebHost,而微软提供了网络主机CreateDefaultBuilder(参数)来帮助我们更轻松得创建网络主机。
常常我们的需求不需要创建网项目,比如后台任务,那么我们如何像使用AspNetCore一样创建控制台项目。
如何在控制台程序中创建主机
通过点网新控制台创建一个控制台项目
通过努格特添加以下包
微软。扩展。托管
首先,我们看下IHostBuilder接口里的方法
公共接口IHostBuilder
{
IHost Build();
IHostBuilder ConfigureAppConfiguration(ActionHostBuilderContext,IConfigurationBuilder configure delegate);
IHostBuilder ConfigureContainerTContainerBuilder(ActionHostBuilderContext,TContainerBuilder配置委托);
IHostBuilder ConfigureHostConfiguration(ActionIConfigurationBuilder配置委托);
IHostBuilder配置服务(ActionHostBuilderContext,IServiceCollection配置委托);
IHostBuilder UseServiceProviderFactoryTContainerBuilder(IServiceProviderFactoryTContainerBuilder工厂);
}
ConfigureAppConfiguration()可以配置应用的一些配置,如环境变量等等
配置容器()UseServiceProviderFactory()可以配置替换默认的依赖注入的组件,比如替换成Autofac
ConfigureHostConfiguration()可以配置图标配置
配置服务()可以注入服务
接下去,通过以下代码,我们可以构建一个简单的主机。
静态void Main(string[] args)
{
CreateDefaultHost(参数)。构建()。run();
}静态IHostBuilder CreateDefaultHost(string[]args)=新主机生成器()。配置主机配置(生成器=
{ //todo
})。ConfigureAppConfiguration((ctx,builder)=1
{
建设者。SetBasePath(AppContext .基本目录)。AddJsonFile(appsettings.json ,true,true)。AddJsonFile($appsettings .{ctx .托管环境。环境名称} . json ,真,真)。AddEnvironmentVariables()
;
})。ConfigureServices((ctx,services)=)
{
服务添加日志记录();
服务AddHostedServiceCustomHostService();
})。UseConsoleLifetime()
;
公共类CustomHostService:IHostedService { private I logger _ logger;私有任务执行任务公共任务启动异步(.) {
_logger .LogInformation($ { name of(CustomHostService):} start );
_executingTask=ExecuteAsync(.);if(_执行任务.已完成){ return _ executing task
}返回任务。已完成的任务;
}公共任务stop async(取消令牌取消令牌){返回任务.WhenAny(_executingTask,Task .延迟(超时.无限,取消令牌));
}公共任务执行异步(.) {
_logger .LogInformation($ {的名称(CustomHostService):正在执行} )返回任务。延时(5000);
}
}
如上,我们自定义的CustomHostService需要实现IHostedService接口,当然,我们可以直接继承后台服务类。
在实现了IHostedService接口后,我们通过服务AddHostedService()进行注入,或者通过服务AddTransientIHostedService,THostedService()进入注入。
启动以上项目,我们发现,我们的程序默认的托管环境一直是生产,那么如何修改呢?
配置环境变量
在AspNetCore项目中,我们可以通过设置环境变量ASPNETCORE _环境的值来指定主机环境变量的。而在通用主机中暂时没有这一项配置。
如果查看IHostBuilder的扩展,我们会发现以下方法:
新主机生成器()。UseContentRoot(.)。使用环境(.).
查看源代码后,我们可以通过ConfigureHostConfiguration()方法将这些配置配置到主机中。
现在我们假设我们以DOTNETCORE _环境来指定通用主机的环境。
新建主机构建器().配置主机配置(生成器=
{
建筑商AddInMemoryCollection(新字典字符串,字符串
{
[主机默认值。环境关键字]=环境获取环境变量( DOTNETCORE _ ENVIRONMENT ),
}) //Nuget:微软。扩展。配置。命令行
//.AddCommandLine(参数)
;
})
//.
现在让我们打开命令行测试下。设置完成环境变量后我们通过网络运行启动程序。查看输出,主机环境变成为阶段
# 设置环境变量$ env:DOTNETCORE _ ENVIRONMENT= Stage #查看环境变量$env:DOTNETCORE_ENVIRONMENT
当然我们也可以通过命令行的参数来设置启动的环境变量等值。
安装包微软。扩展。配置。命令行
在ConfigureHostConfiguration()中使用AddCommandLine(参数)来指定参数。
现在我们可以通过点网运行环境=开发来指定偏差环境了,此时我们发现我们终于成功加载appsettings .开发。json中的配置信息了。
使用Autofac来替代默认的国防情报部
简单认识一下Autofac
一个第三方的依赖注入容器,相对微软。扩展。依赖注入使用更加简单方便。
集成到Host中
通过努格特安装以下两个包
安装包Autofac
安装包Autofac .扩展。依赖部分
我们可以使用UseServiceProviderFactory()和服务AddAutofac()将默认的国防情报部替换成Autofac
使用ConfigureContainerContainerBuilder()可以使用Autofac来注入服务;
//省略了非关键代码静态ihost builder CreateDefaultHost(string[]args)=新主机生成器()//.略。ConfigureServices((ctx,services)=)
{
服务添加日志记录(x={ x . add console();});
服务AddAutofac();
})。ConfigureContainerContainerBuilder(生成器=
{
建筑商RegisterTypeCustomHostService()。AsIHostedService()。instance per dependency();
})。UseServiceProviderFactoryContainerBuilder(new AutofacServiceProviderFactory())//.略
总结
个人认为出现通用主机解决的几个痛点,相对AspNetCore中的管道机制,控制台程序如果不依靠通用主机来管理迪,想进行大量微软。扩展扩张包的集成会非常困难。通过IHostedService,可以方便的进行服务的托管。
以上就是使用通用主机的方法的详细内容,更多关于使用通用主机的资料请关注我们其它相关文章!