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