快速了解如何在.NETCORE中使用Generic-Host建立主機
.NETCORE 中的 Generic Host
本文以自己在工作中學(xué)習(xí)和使用.net core generic-host 作一個總結(jié)。
前言
在創(chuàng)建的ASPNETCORE項目中,我們可以在Main()中看見,我們通過IWebHostBuild創(chuàng)建了一個IWebHost,而微軟提供了WebHost.CreateDefaultBuilder(args)來幫助我們更輕松得創(chuàng)建WebHost。
常常我們的需求不需要創(chuàng)建Web項目,比如后臺任務(wù),那么我們?nèi)绾蜗袷褂肁spNetCore一樣創(chuàng)建控制臺項目。
如何在控制臺程序中創(chuàng)建主機
通過dotnet new console 創(chuàng)建一個控制臺項目
通過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() 可以配置應(yīng)用的一些配置,如環(huán)境變量等等
ConfigureContainer() & UseServiceProviderFactory() 可以配置替換默認的依賴注入的組件,比如替換成Autofac
ConfigureHostConfiguration() 可以配置IConfiguration
ConfigureServices() 可以注入服務(wù)
接下去,通過以下代碼,我們可以構(gòu)建一個簡單的主機。
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 需要實現(xiàn) IHostedService接口,當然,我們可以直接繼承 BackgoundService 類。
在實現(xiàn)了 IHostedService 接口后,我們通過 services.AddHostedService<>() 進行注入,或者通過 service.AddTransient<IHostedService,THostedService>() 進入注入。
啟動以上項目,我們發(fā)現(xiàn),我們的程序默認的Hosting Environment一直是Production,那么如何修改呢 ??
配置環(huán)境變量
在AspNetCore項目中,我們可以通過設(shè)置環(huán)境變量ASPNETCORE_ENVIRONMENT的值來指定主機環(huán)境變量的。而在Generic Host 中暫時沒有這一項配置。
如果查看IHostBuilder的擴展,我們會發(fā)現(xiàn)以下方法:
new HostBuilder() .UseContentRoot(...) .UseEnvironment(...) ...
查看源代碼后,我們可以通過ConfigureHostConfiguration()方法將這些配置配置到主機中。
現(xiàn)在我們假設(shè)我們以DOTNETCORE_ENVIRONMENT來指定GenericHost的環(huán)境。
new HostBuilder().ConfigureHostConfiguration(builder =>
{
builder.AddInMemoryCollection(new Dictionary<string, string>
{
[HostDefaults.EnvironmentKey] = Environment.GetEnvironmentVariable("DOTNETCORE_ENVIRONMENT"),
}) // Nuget:Microsoft.Extensions.Configuration.CommandLine
//.AddCommandLine(args)
;
})
//...
現(xiàn)在讓我們打開命令行測試下。設(shè)置完成環(huán)境變量后我們通過dotnet run 啟動程序。查看輸出,Host Environment 變成為 Stage
# 設(shè)置環(huán)境變量$env:DOTNETCORE_ENVIRONMENT='Stage'# 查看環(huán)境變量$env:DOTNETCORE_ENVIRONMENT
當然我們也可以通過 commandline 的參數(shù)來設(shè)置啟動的環(huán)境變量等值。
Install-Package Microsoft.Extensions.Configuration.CommandLine
在ConfigureHostConfiguration()中使用.AddCommandLine(args)來指定參數(shù)。
現(xiàn)在我們可以通過 dotnet run --environment=Development來指定dev環(huán)境了,此時我們發(fā)現(xiàn)我們終于成功加載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來注入服務(wù);
//省略了非關(guān)鍵代碼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())//...略
總結(jié)
個人認為出現(xiàn)GenericHost解決的幾個痛點,相對AspNetCore中的管道機制,控制臺程序如果不依靠GenericHost來管理Di,想進行大量Microsoft.Extensions包的集成會非常困難。通過IHostedService,可以方便的進行服務(wù)的托管。
以上就是使用Generic-Host的方法的詳細內(nèi)容,更多關(guān)于使用Generic-Host的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Form_Load里面調(diào)用Focus無效的解決方法
在調(diào)用Form_Load的時候,F(xiàn)orm其實還沒有進入展示階段,自然Focus()調(diào)用也就沒效果了。2013-02-02
Winform利用分頁控件實現(xiàn)導(dǎo)出PDF文檔功能
當前的Winform分頁控件中,當前導(dǎo)出的數(shù)據(jù)一般使用Excel來處理,但是有框架的使用客戶希望分頁控件能夠直接導(dǎo)出PDF,所以本文整理了一下分頁控件導(dǎo)出PDF的處理過程,分享一下2023-03-03
Quartz.Net任務(wù)和觸發(fā)器實現(xiàn)方法詳解
這篇文章主要介紹了Quartz.Net任務(wù)和觸發(fā)器實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12

