如上,我们自定义的 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 的参数来设置启动的环境变量等值。
Install-Package Microsoft.Extensions.Configuration.CommandLine
在ConfigureHostConfiguration()中使用.AddCommandLine(args)来指定参数。
现在我们可以通过 dotnet run --environment=Development来指定dev环境了,此时我们发现我们终于成功加载appsettings.Development.json中的配置信息了。
使用Autofac来替代默认的 DI
简单认识一下Autofac
一个第三方的依赖注入容器,相对Microsft.Extensions.DependencyInjection使用更加简单方便。
集成到Host中
通过Nuget安装以下两个包
Install-Package Autofac Install-Package Autofac.Extensions.DependencyInection
我们可以使用UseServiceProviderFactory()和service.AddAutofac() 将默认的DI 替换成 Autofac;
使用ConfigureContainer<ContainerBuilder>()可以使用Autofac来注入服务;










