asp.Netcore 3.1エントリ:Program.csのMain関数

19318 ワード

本論文ではProgramを分析する.cs中のMain()関数中のコードの運行順序はaspを分析する.Netcoreプログラムの起動は,ソースコードの解析ではなく,プログラム開始時に実行される順序を整理することに重点を置く.いったいどんな実例が使われているのか、どんな法方が使われているのか.
asp.Netcore 3.1のプログラムエントリはプロジェクトProgramにあります.csファイルには、以下のようにあります.
ususing System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace WebDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup();
                });
    }
}

1.プログラム類


プログラムクラスは、プロジェクトのルートディレクトリに定義するプログラムである.csファイルのすべて.Netcoreプログラムの入り口、aspを含む.Netcoreプログラム.これは面白いですが、制御端プログラムに似ています.以前のウェブプロジェクトに比べてプログラムのエントリがなく、ウェブしかありません.config、globalのようなプロファイルとグローバルファイルというプログラムエントリのないwebプロジェクトは、aspを理解しやすいと思います.Netcoreはどのように働いていますか.
asp.Netcore 3.1のプログラムクラスでは、Main()とCreateHostBuilder()の2つのメソッドが定義されています.

2.メインプログラム入口Program.Main()メソッド

public static void Main(string[] args)
{
        CreateHostBuilder(args).Build().Run();
}

Main()メソッドはプロジェクト全体のエントリメソッドであり,Cシリーズ言語のようにすべてのプログラムエントリがある.ここでmain()は1行のコードしかありませんが、実際には3つの関数Cが実行されています.
  1 IHostBuilder builder= CreateHostBuilder(args);
  2 IHost host=builder.Build();
  3 host.Run();

最初の行は、Programクラスで定義されたCreateHostBuilderです.主にIhostBuilderインスタンスbuilderを生成します.
2行目はbuilder.を通ります.Build()メソッドは、Ihostインスタンスhostを生成します.
3つ目はhost.Run()メソッドは,webプロジェクトの実行を開始すると,様々なリクエストに応答できる.
この過程で最も煩雑なのはbuilderの作成であり、本稿の重点編幅はここにある.

3.ホストBuilder:Programの作成と構成CreateHostBuilder(args)メソッド


分解CreateHostBuilder(args)の定義


このメソッドはlamada式によってPogramクラスに定義されます.ワンセグ化されているので、このような簡単な方法で定義できます(匿名関数、lamada、組み込み依頼については、私の前の記事C#匿名メソッド(関数)匿名依頼内蔵汎用依頼lamada 1を参照してください).読みやすくするために上记のようにMain()の方法を分析したので、実际の定义は以下の通りです.
  1         public static IHostBuilder CreateHostBuilder(string[] args)
  2         {
  3             IHostBuilder builder = Host.CreateDefaultBuilder(args);
  4             Action < IWebHostBuilder > configAction = delegate(IWebHostBuilder webBuilder)
  5             {
  6                 webBuilder.UseStartup();
  7             };
  8             builder=builder.ConfigureWebHostDefaults(configAction);
  9             return builder;
 10         }

3.1. ビルダー誕生:IHostBuilderの生成


ホストからCreateHostBuilder()メソッド分析に着手


CreateHostBuilder()の最初の行のコードはHostを呼び出すことです.CreateDefaultBuilder(args)メソッドを使用して、IBuilderオブジェクトインスタンスを作成します.
IHostBuilder builder = Host.CreateDefaultBuilder(args);

IHostBuilderは非常に重要なインスタンスであり、このインスタンスがあれば、より多くの構成操作をロードし続けることができます.IHostBuilder.を通りますBuild()生産IHostインスタンス.最終的にIHostを通過した.Run()プロジェクトを実行します.
3.1.1 Hostクラス——初期ビルダー静的クラスを生成する
HostクラスはMicrosoftで定義されています.Extensions.Hostingネーミングスペース(Program.csでこのネーミング公開を参照)の下の静的クラス.プログラムでcsに導入する.
次のように宣言します.
  1 using Microsoft.Extensions.Hosting;
  2 
  3 namespace Microsoft.Extensions.Hosting
  4 {
  5     public static class Host
  6     {
  7 	    public static IHostBuilder CreateDefaultBuilder();
  8         public static IHostBuilder CreateDefaultBuilder(string[] args);
  9     }
 10 }

Host静的クラスは、CreateDefaultBuilder()の1つです.合計2つのリロード宣言:1つはパラメータ付き、1つはパラメータなし.参照ソース(.NET Core 3.0の深いソース理解Host(一)2)パラメータなしのリロードは、nullをパラメータ呼び出しバンドパラメータ形式として以下のようにして実際には存在する.
  1 public static IHostBuilder CreateDefaultBuilder() =>CreateDefaultBuilder(args: null);
3.1.2 Host.CreateDefaultBuilder(args)  
                   Microsoft.Extensions.Hosting.HostBuilderInitializes a new instance of the Microsoft.Extensions.Hosting.HostBuilder class with pre-configured defaults,         3)。
ContentRootPath ; Host.IConfigurationEnvironmentName,     args,    IConfiguration.[EnvironmentName] json;          。
       2、3,  .NET Core 3.0       Host( ),             ,    Host.CreateDefaultBuilder   


3.2. IHostBuilderからIWebHostBuilderへ


続けてCreateHostBuilder()の法的分析では、3.1でIHostBuilderのインスタンスが確立するとbuilder.を通過する.コンフィギュレーションWebHostDefaults(Action)メソッドは、IHostBuilderインスタンスをウェブホストの性質のwebbuilder(IWebHostBuilder)に変換します。


IHoustBuilder.ConfigureWebHostDefaults(Action)メソッドはMicrosoftで定義する.Extensions.Hosting.GenericHostBuilderExtensionsスタティッククラス(GenericHostBuilderExtensions.cs)では、このスタティッククラスがこのスタティックメソッドを定義します.

3.2.1. ConfigureWebHostDefaults()パラメータ

    configure       Action ,              :
webBuilder.UseStartup();


3.2.2. ConfigureWebHostDefaults()メソッド定義

  ConfigureWebHostDefaults(Action )     IHostBuilder     (           ,   this builder  ,     )。
       , 3.         :
    
    
  
  
  1  	     public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action configure)
  2         {
  3             Action webconfigure = delegate(IWebHostBuilder webHostBuilder)
  4             {
  5                 WebHost.ConfigureWebDefaults(webHostBuilder);
  6                 configure(webHostBuilder);
  7             };
  8             return builder.ConfigureWebHost(webconfigure);
  9         }
      IHostBuilder       ConfigureWebHost(Action)(        Microsoft.Extensions.Hosting.GenericHostWebHostBuilderExtensions    )。

3.2.2.1 IHostBuilderをIWebHostBuilder:builderに する.ConfigureWebHost(webconfigure)メソッド


3.2.2.1.1 Actionwebconfigureパラメータ
    ,           ,      :

IWebHostBuilderのデフォルトのWeb を します.
    
    
  
  
WebHost.ConfigureWebDefaults(webHostBuilder);
 core2.1      CreateHostBuilder() WebHost.CreateDefaultBuilder(arg)   ,core3.1,  Host.ConfigureDefualts(arg) ,     ConfigureWebHost   。           ,                   。

パラメータ の び し
configure(webHostBuilder);
   3.2.1  
    
    
  
  
webBuilder.UseStartup();
には、 の で を する に しく します.
3.2.2.1.2 builder.ConfigureWebHost(webconfigure)メソッド
   Microsoft.Extensions.Hosting.GenericHostWebHostBuilderExtensions(GenericHostWebHostBuilderExtensions.cs) 
  1 using System;
  2 using Microsoft.AspNetCore.Hosting;
  3 using Microsoft.AspNetCore.Hosting.Internal;
  4 
  5 namespace Microsoft.Extensions.Hosting
  6 {
  7     public static class GenericHostWebHostBuilderExtensions
  8     {
  9         public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action configure)
 10         {
 11             var webhostBuilder = new GenericWebHostBuilder(builder);
 12             configure(webhostBuilder);
 13             return builder;
 14         }
 15     }
 16 }

Microsoft.AspNetCore.Hosting.Internal.GenericWebHostBuilder
 asp.net core 2.1  IWebHostBuilder  asp.net core 3.1       IHostBuilder  webhost builder  ,      。  
  Microsoft.AspNetCore.Hosting.Internal.GenericWebHostBuilder   。GenericWebHostBuilder      。         ,             ,        GenericWebHostBuilder.cs   。              :
internal class GenericWebHostBuilder : IWebHostBuilder, ISupportsStartup, ISupportsUseDefaultServiceProvider
{
     public GenericWebHostBuilder(IHostBuilder builder);
}
      ,  Asp.net core 3.1    IHostBuilder   IWebHostBuilder          IHostBuilder                     2.1  IWebHostBuilder。           web     ,        (    4

3.2.2.2 IWebHostBuilderにWeb パラメータを する パラメータ:やっと を した
    
    
  
  
configure(webhostBuilder);
           ,        ,    IHostBuilder   IWebHostBuilder ,  config           
    
    
  
  
  1 //  builder.ConfigureWebHostDefaults()(--> program.GreateHostBuilder() )
  2 //                builder.ConfigureWebHost()
  3 WebHost.ConfigureWebDefaults(webHostBuilder);
  4 //Program.CreateHostBuilder()          builder.ConfigureWebHostDefaults()
  5 //   builder.ConfigureWebHostDefaults()            builder.ConfigureWebHost()
  6 webBuilder.UseStartup();
3.2.2.2.1 WebHost.ConfigureWebDefoualts(IWebHostBuilder)メソッド:
    Asp.net core 2.1   WebHost.CreateDefaultBuilder(args)         ,  Asp.net core 3.1 , IWebHostBuilder    IHostBuilder ,   IHostBuilder.ConfigureWebHost()       。        Host.CreateDefaultBuilder(args),           Web     。       web     ,       。           ,        WebHost.cs   (    5)。
3.2.2.2.2 webBuilder.UseStartup()  :
UseStartup() webbuilder     ,   Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions    (WebHostBuilderExtensions.cs),       
public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, Type startupType)

メソッド からStartupクラスが されていることがわかります.この は に を し、Startupクラスを し、startupクラスの に します.

3.3. にbuilderコアのコードを します

1.IHostBuilder builder = Host.CreateDefaultBuilder(args);
      builder(  app.json)
2.IWebHostBuilder webHostBuilder= new GenericWebHostBuilder(builder);
   webbuilder
3.WebHost.ConfigureWebDefaults(webHostBuilder);
 webbuilder          
4.webBuilder.UseStartup();
  startup     


4.まとめ

aps.net core 3.1           。  3     builder ,  builder  host ,    host    。  builder builder   ,host         。core 3.1   core2.1   ,   IWebHostBuilder      IHostBuilder,   core 3.1        ,           web  。
  asp.net core  builder              ,             ,                 ,    。
       ,        :

1. .NET Core 3.0       Host( )
2. .NET Core 3.0       Host( )
       2           Ihostbuilder           
3.     :.NET        IHostBuilder    
4.     :ASP.NET Core          startup     


1. C#     (  )             lamada   :edzjx
2. .NET Core 3.0       Host( )   :  
3.     Host.CreateDefaultBuilder      :Micrsoft    
4. GenericWebHostBuilder.cs      :Asp.net@github 
5. WebHost.cs      :Asp.net@github 
6. .NET Core 3.0       Host( )   :  
7.     :.NET        :Micrsoft    
8.     :ASP.NET Core          :Micrsoft