1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          Generic-Host 快速使用指南

          來源:互聯網轉載 時間:2024-01-29 07:41:13

          .NETCORE 中的 Generic Host

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

          前言

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

          常常我們的需求不需要創建Web項目,比如后臺任務,那么我們如何像使用AspNetCore一樣創建控制臺項目。

          如何在控制臺程序中創建主機

          1. 通過dotnet new console 創建一個控制臺項目
          2. 通過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() 可以配置應用的一些配置,如環境變量等等
          • 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中的配置信息了。

          使用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())//...略

          總結

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

          源碼: https://github.com/missxueo/docs-generic-host

          155472.html

          標簽:generic host-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          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...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>