欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

快速了解如何在.NETCORE中使用Generic-Host建立主機

 更新時間:2020年05月29日 17:28:33   作者:蝴蝶刀刀  
這篇文章主要介紹了如何在.NETCORE中使用Generic-Host建立主機,文中代碼非常詳細,可供大家參考,感興趣的朋友不妨閱讀完

.NETCORE 中的 Generic Host

本文以自己在工作中學習和使用.net core generic-host 作一個總結。

前言

在創(chuàng)建的ASPNETCORE項目中,我們可以在Main()中看見,我們通過IWebHostBuild創(chuàng)建了一個IWebHost,而微軟提供了WebHost.CreateDefaultBuilder(args)來幫助我們更輕松得創(chuàng)建WebHost。

常常我們的需求不需要創(chuàng)建Web項目,比如后臺任務,那么我們如何像使用AspNetCore一樣創(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() 可以配置應用的一些配置,如環(huán)境變量等等

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 需要實現(xiàn) IHostedService接口,當然,我們可以直接繼承 BackgoundService 類。

在實現(xiàn)了 IHostedService 接口后,我們通過 services.AddHostedService<>() 進行注入,或者通過 service.AddTransient<IHostedService,THostedService>() 進入注入。

啟動以上項目,我們發(fā)現(xiàn),我們的程序默認的Hosting Environment一直是Production,那么如何修改呢 ??

配置環(huán)境變量

在AspNetCore項目中,我們可以通過設置環(huán)境變量ASPNETCORE_ENVIRONMENT的值來指定主機環(huán)境變量的。而在Generic Host 中暫時沒有這一項配置。

如果查看IHostBuilder的擴展,我們會發(fā)現(xiàn)以下方法:

new HostBuilder()
 .UseContentRoot(...)
 .UseEnvironment(...) ...

查看源代碼后,我們可以通過ConfigureHostConfiguration()方法將這些配置配置到主機中。

現(xiàn)在我們假設我們以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)在讓我們打開命令行測試下。設置完成環(huán)境變量后我們通過dotnet run 啟動程序。查看輸出,Host Environment 變成為 Stage

# 設置環(huán)境變量$env:DOTNETCORE_ENVIRONMENT='Stage'# 查看環(huán)境變量$env:DOTNETCORE_ENVIRONMENT
當然我們也可以通過 commandline 的參數來設置啟動的環(huán)境變量等值。

Install-Package Microsoft.Extensions.Configuration.CommandLine

ConfigureHostConfiguration()中使用.AddCommandLine(args)來指定參數。

現(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來注入服務;

//省略了非關鍵代碼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())//...略

總結

個人認為出現(xiàn)GenericHost解決的幾個痛點,相對AspNetCore中的管道機制,控制臺程序如果不依靠GenericHost來管理Di,想進行大量Microsoft.Extensions包的集成會非常困難。通過IHostedService,可以方便的進行服務的托管。

以上就是使用Generic-Host的方法的詳細內容,更多關于使用Generic-Host的資料請關注腳本之家其它相關文章!

相關文章

  • 在Form_Load里面調用Focus無效的解決方法

    在Form_Load里面調用Focus無效的解決方法

    在調用Form_Load的時候,F(xiàn)orm其實還沒有進入展示階段,自然Focus()調用也就沒效果了。
    2013-02-02
  • Winform利用分頁控件實現(xiàn)導出PDF文檔功能

    Winform利用分頁控件實現(xiàn)導出PDF文檔功能

    當前的Winform分頁控件中,當前導出的數據一般使用Excel來處理,但是有框架的使用客戶希望分頁控件能夠直接導出PDF,所以本文整理了一下分頁控件導出PDF的處理過程,分享一下
    2023-03-03
  • C#實現(xiàn)航班預訂系統(tǒng)

    C#實現(xiàn)航班預訂系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)航班預訂系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C#中的Hashtable?類使用詳解

    C#中的Hashtable?類使用詳解

    這篇文章主要介紹了C#中的Hashtable?類使用詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • C#中異步回調函數用法實例

    C#中異步回調函數用法實例

    這篇文章主要介紹了C#中異步回調函數用法,實例分析了異步回調函數的定義及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#中DataTable實現(xiàn)篩選查詢的示例

    C#中DataTable實現(xiàn)篩選查詢的示例

    本文主要介紹了C#中DataTable實現(xiàn)篩選查詢的示例,主要是DataTable進行過濾篩選,常用的一些方法為:Select,dataview,具有一定的參考價值,感興趣的可以了解一下
    2023-04-04
  • C#算法之兩數之和

    C#算法之兩數之和

    這篇文章介紹了C#算法之兩數之和,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • 如何在C#中使用OpenCV(GOCW使用教程)

    如何在C#中使用OpenCV(GOCW使用教程)

    這篇文章主要介紹了如何在C#中使用OpenCV(GOCW使用教程),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • Quartz.Net任務和觸發(fā)器實現(xiàn)方法詳解

    Quartz.Net任務和觸發(fā)器實現(xiàn)方法詳解

    這篇文章主要介紹了Quartz.Net任務和觸發(fā)器實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • c#判斷操作系統(tǒng)位數的示例分享

    c#判斷操作系統(tǒng)位數的示例分享

    這篇文章主要介紹了c#判斷操作系統(tǒng)位數的示例,在.net 4.5中,判斷操作系統(tǒng)不用再寫方法去判斷了,有直接可以利用的屬性了哦
    2014-01-01

最新評論