最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

.NETCORE 中的 Generic Host

本文以自己在工作中學(xué)習(xí)和使用.net core generic-host 作一個(gè)總結(jié)。

前言

在創(chuàng)建的ASPNETCORE項(xiàng)目中,我們可以在Main()中看見,我們通過(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 類。

在實(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í)沒有這一項(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)在讓我們打開命令行測(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)文章!

  • C#編寫的windows計(jì)算器的實(shí)例代碼

    C#編寫的windows計(jì)算器的實(shí)例代碼

    這篇文章介紹了C#編寫windows計(jì)算器的代碼,有需要的朋友可以參考一下
    2013-07-07
  • C#實(shí)現(xiàn)無(wú)損壓縮圖片的示例詳解

    C#實(shí)現(xiàn)無(wú)損壓縮圖片的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)無(wú)損壓縮圖片功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • c# 死鎖和活鎖的發(fā)生及避免

    c# 死鎖和活鎖的發(fā)生及避免

    多線程編程時(shí),如果涉及同時(shí)讀寫共享數(shù)據(jù),就要格外小心。如果共享數(shù)據(jù)是獨(dú)占資源,則要對(duì)共享數(shù)據(jù)的讀寫進(jìn)行排它訪問(wèn),最簡(jiǎn)單的方式就是加鎖。鎖也不能隨便用,否則可能會(huì)造成死鎖和活鎖。本文將通過(guò)示例詳細(xì)講解死鎖和活鎖是如何發(fā)生的以及如何避免它們。
    2020-11-11
  • C# string格式的日期時(shí)間字符串轉(zhuǎn)為DateTime類型的方法

    C# string格式的日期時(shí)間字符串轉(zhuǎn)為DateTime類型的方法

    這篇文章主要介紹了C# string格式的日期時(shí)間字符串轉(zhuǎn)為DateTime類型的方法,需要的朋友可以參考下
    2017-02-02
  • C#中泛型類和擴(kuò)展方法如何使用

    C#中泛型類和擴(kuò)展方法如何使用

    這篇文章介紹了C#中泛型類和擴(kuò)展方法的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • C#中托管DLL和非托管DLL的區(qū)別詳解

    C#中托管DLL和非托管DLL的區(qū)別詳解

    這篇文章主要介紹了C#中托管DLL和非托管DLL的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • C#中數(shù)組、ArrayList和List三者的區(qū)別詳解及實(shí)例

    C#中數(shù)組、ArrayList和List三者的區(qū)別詳解及實(shí)例

    這篇文章主要介紹了C#中數(shù)組、ArrayList和List三者的區(qū)別詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 詳解如何在ASP.NET Core配置請(qǐng)求超時(shí)中間件

    詳解如何在ASP.NET Core配置請(qǐng)求超時(shí)中間件

    本文參考官方文檔,為大家詳細(xì)介紹如何使用Asp.net core 8.0 的最小API 模板項(xiàng)目,配置超時(shí)中間件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-01-01
  • c# 獲取數(shù)據(jù)庫(kù)中所有表名稱的方法

    c# 獲取數(shù)據(jù)庫(kù)中所有表名稱的方法

    在很多情況下我們需要將指定的數(shù)據(jù)庫(kù)中的所有表都列出來(lái)。在使用c#進(jìn)行軟件開發(fā)時(shí),我們有哪些方法可是實(shí)現(xiàn)這個(gè)目的呢?本人對(duì)此進(jìn)行概要的總結(jié),有以下6中方式可以實(shí)現(xiàn)這個(gè)目的。
    2010-02-02
  • 最新評(píng)論

    卢龙县| 鄢陵县| 桐乡市| 冀州市| 新绛县| 民县| 台安县| 嵊州市| 夹江县| 北碚区| 宁河县| 米脂县| 张家川| 林周县| 县级市| 巴林右旗| 新源县| 阜宁县| 溧阳市| 齐河县| 五华县| 万荣县| 乾安县| 潢川县| 苍山县| 陕西省| 昔阳县| 峨眉山市| 安国市| 长泰县| 宜章县| 扶余县| 京山县| 澎湖县| 文安县| 盐池县| 郑州市| 正蓝旗| 防城港市| 威信县| 广平县|