本文以自己在工作中學習和使用.net core generic-host 作一個總結。
在創建的ASPNETCORE項目中,我們可以在Main()
中看見,我們通過IWebHostBuild
創建了一個IWebHost
,而微軟提供了WebHost.CreateDefaultBuilder(args)
來幫助我們更輕松得創建WebHost
。
常常我們的需求不需要創建Web項目,比如后臺任務,那么我們如何像使用AspNetCore一樣創建控制臺項目。
dotnet new console
創建一個控制臺項目首先,我們看下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 的參數來設置啟動的環境變量等值。
Install-Package Microsoft.Extensions.Configuration.CommandLine
在ConfigureHostConfiguration()
中使用.AddCommandLine(args)
來指定參數。
現在我們可以通過 dotnet run --environment=Development
來指定dev環境了,此時我們發現我們終于成功加載appsettings.Development.json
中的配置信息了。
一個第三方的依賴注入容器,相對Microsft.Extensions.DependencyInjection
使用更加簡單方便。
通過Nuget安裝以下兩個包
Install-Package Autofac
Install-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,可以方便的進行服務的托管。
源碼: https://github.com/missxueo/docs-generic-host
155472.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
Y閱:我愿意為你用一生去闖蕩是什么歌?《我愿意為你用一生去闖蕩》在哪里。專輯:Where歌手:杜歌杜歌-Where作詞:AG作曲:AG編曲:蘇宏亮曲鵬濤心里有淚,但從來沒有心里的痛。一個人躲起來挺直腰板執拗地假裝走在前面很久,卻忘不了一個溫暖卻發紅的眼神。即使在世界上做一個愛人也沒有壞處。我愿意用我的一生為你旅行,我的朋友。再難,我也不怕只是一個男人的謊言。我的朋友,你現在在哪里?我愿意為你流浪一...
126郵箱登錄入口怎么登錄?打開計算機瀏覽器,在搜索欄中搜索郵箱126。2. 方法一:在手機上安裝并運行網易郵箱主客戶端。3. 要輸入的掃描代碼。4. 方法二:填寫賬號和密碼。5. 單擊“登錄”。126郵箱手機賬號登錄入口?具體步驟如下:打開手機瀏覽器,輸入126郵箱網址:mail.126.com。輸入email 126的用戶名和密碼,您可以用手機登錄email 12601打開您電腦上的任何瀏覽器...
csgoiem全球總決賽賽制?還有期末考試。IEM8卡托維茲世界總決賽是繼S3世界總決賽之后第一個真正意義上的LOL國際賽事。IEM8卡托維茲世界總決賽是繼S3世界總決賽之后第一個真正意義上的LOL國際賽事。八支隊伍分成兩組,老對手之間的競爭再次被點燃,新對手也可能出現。雙循環賽制保證了觀眾可以看到各隊之間多樣化的比賽,也給了各隊真正展示實力,爭奪冠軍的機會。we戰隊榮譽都有哪些?2011年WCG...