Net Core 3.0 及 AspNet 3.0

收集1、200行代码,7个对象——让你了解ASP.NET Core框架的本质

2、ASP.NET Core框架揭秘(持续更新中…)

3、.net core系列之《从源码对Configuration的底层运行机制进行分析》

      参考下图(来源:https://www.cnblogs.com/jionsoft/p/12154519.html

     与 Host 有关的类/接口,在 命名空间Microsoft.Extensions.Hosting 中,汇总如下:

                                         比较命名空间Microsoft.AspNetCore.Hosting 相应 的 IWebHost 、IWebHostBuilder 等

      IHost          IHostBuilder    其它(IHostEnvironment、IHostedService、IHostLifetime、IHostApplicationLifetime)

      Host(内)  HostBuilder   其它(HostBuilderContext、HostOptions、Environments(静)、HostDefaults(静))

      Host(静).CreateDefaultBuilder(Args[])  

//----------------------------------------------------------------------------------------------

AspNet 3.0 的启动与配置:(官方模版代码的探源)

0、Host 、IHost 通用主机,

     官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-3.0

     .CreateDefaultBuilder(string【】args)   默认产生 一个 HostBuilder。   源代码?  官方 Gihub 难以找到。

     .ConfigureWebHostDefaults(...)创建一个 IHostedService 的实现。

       参考:官方定义:

        GenericHostBuilderExtensions.ConfigureWebHostDefaults(IHostBuilder, Action<IWebHostBuilder>) Method

        https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.hosting.generichostbuilderextensions.configurewebhostdefaults?view=aspnetcore-3.1#Microsoft_Extensions_Hosting_GenericHostBuilderExtensions_ConfigureWebHostDefaults_Microsoft_Extensions_Hosting_IHostBuilder_System_Action_Microsoft_AspNetCore_Hosting_IWebHostBuilder__

       设置默认给 IWebHostBuilder:   使用 Kestrel,配置 application's configuration providers, 增加 HostFiltering 中间件, 增加 ForwardedHeaders 中间件,如果  ASPNETCORE_FORWARDEDHEADERS_ENABLED=true, 使能 IIS 集成。

------------------------------------------------------------------------------------------------

1、HostBuilderIHostBuilder 建造器: 可以使用 4 个方法配置(配Host、配App、配Services,配Container,最后 Build),还有很多扩展方法:UseContentRoot(IHostBuilder, String)UseEnvironment(IHostBuilder, String)ConfigureLogging(IHostBuilder, Action<HostBuilderContext,ILoggingBuilder>)ConfigureLogging(IHostBuilder, Action<ILoggingBuilder>)

      扩展方法: ConfigureWebHostDefaults(Action<IWebHostBuilder> configure) 配置 WebHost。

      初级知识:接口的方法参数 (表示为Action<>、Func<>),很多实现都采用 Lamada 函数,=> 是标志,函数的参数可能就是需要配置的目标,并返回作为整个应用系统的设置。      

     1)配主机Host方法: ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate)

          实质是从:启动命令行、环境变量、配置文件(Json\XML\Ini等)获取配置参数,最后得到一个 IConfigurationRoot ,从中得到参数(Key、Value 对),从 属性:Item[String]  读取。  

    (1) IConfigurationBuilder (实现 ConfigurationBuilder),有一个方法 Build()

返回 IConfigurationRoot (继承IConfiguration )。  (可能运行时,调用每个源的 Build(IConfigurationBuilder builder)。
  (2) 属性 Sources 源是:IList<IConfigurationSource>(实现有多个: 其中 前二个是面向文件的,后面三个简单些
          例如:FileConfigurationSource 的细化 JsonConfigurationSource  代表 一个 JSON 文件作为源。
 
      (3)IConfigurationSource  的方法Build 定义: public IConfigurationProvider Build (IConfigurationBuilder builder);    其中 IConfigurationProvider (实现:ChainedConfigurationProvider、ConfigurationProvider 细化有:FileConfigurationProvider
       比如:CommandLineConfigurationSource 只有 两个属性 ArgsSwitchMappings,一个 Build 方法;EnvironmentVariablesConfigurationSource 只有一个属性 Prefix,一个方法:Build 。  但两个源的构造器(Constructor)都没有参数!

  (4)IConfigurationProvider  有几种实现,见上。 接口方法主要是:Load()Set(String, String)TryGet(String, String) 。
           ConfigurationProvider  的属性 Data  是焦点,提供 得到的 配置 key、value对。
         CommandLineConfigurationProvider 还有属性:ArgsData ,构建器:
         CommandLineConfigurationProvider (IEnumerable<string> args, IDictionary<string,string> switchMappings = null);
         EnvironmentVariablesConfigurationProvider  属性:Data ,构建器2个,参数可选:
         EnvironmentVariablesConfigurationProvider (【string prefix】);
(5)疑问:最后结果是要获得:IConfigurationRootIConfiguration,需要 IConfigurationBuilder 从
IList<IConfigurationSource> 进行 Build(), 配置源通过 Add加入,
但源
IConfigurationSource 如何产生,并与 IConfigurationProvider 进行关联? 好像上述(1)~(4)中没有方法解决 !

官方对 IConfigurationBuilder 的属性:Properties 有一个解释:
获取 a key/value collection,
能用于
在 IConfigurationBuilder 和 注册的 IConfigurationSources 之间
共享数据。

(6)实际上,ConfigurationBuilder 有很多扩展方法,可以直接使用,用于Add 配置源。
AddCommandLine(IConfigurationBuilder, String[])
AddEnvironmentVariables(IConfigurationBuilder)AddEnvironmentVariables(IConfigurationBuilder, String)
AddJsonFile(IConfigurationBuilder, String)AddJsonFile(IConfigurationBuilder, String, Boolean) 共 5个。
AddXmlFile(IConfigurationBuilder, IFileProvider, String, Boolean, Boolean)  5个。
     
应用举例: configHost => {
                    configHost.SetBasePath(Directory.GetCurrentDirectory());
                    configHost.AddJsonFile("hostsettings.json", optional: true);
                    configHost.AddEnvironmentVariables(prefix: "PREFIX_");
                    configHost.AddCommandLine(args);
                }
//----------------------------------------------------------------------------

       2) 配置应用App方法 :ConfigureAppConfiguration( Action<HostBuilderContext,IConfigurationBuilder> )

          委托方法 lamada 函数的两个参数: HostBuilderContext 、IConfigurationBuilder (后者与配置主机Host 相同!)。

          HostBuilderContext  有三个属性:

          (1)Configuration(IConfiguration,前面类似)、 

          (2)HostingEnvironment(IHostEnvironment)的属性:ApplicationName(string)、EnvironmentName(string)

       ContentRootFileProvider(IFileProvider,指向后者)、ContentRootPath(string,含有应用程序内容的目录的绝对路径)

          (3) Properties(IDictionary<object,object>)。

       3)配置服务Service方法 :ConfigureServices(Action<HostBuilderContext,IServiceCollection>)

           向依赖注入DI容器 加入服务services(放入集合 ServiceCollection)。可以多次调用,结果累加。

          (1) IServiceCollectionServiceCollection : 实现 IList<ServiceDescriptor>等,并通过ServiceDescriptor 描述的服务约定。

           加入集合的方法,全部都是扩展方法(接口扩展):举例参考

            AddWebEncoders(IServiceCollection)
            Add(IServiceCollection, ServiceDescriptor) 

          (2)ServiceDescriptor    描述 服务 service 的 type, implementation,  lifetime。

                 有ServiceType、ImplementationTypeImplementationFactoryImplementationInstanceLifetime 五个只读属性,通过构造器初始化获得。

                 有很多以 :Scoped...、Singleton... 、Transient... 为首字母的方法,应该是 Describe...方法的 生命周期(三个)的特定版本。好像都是 静态(Static)方法,通过使用属性(5个组合)作为参数,以用于产生服务实例。示例如下:

              Describe(Type, Func<IServiceProvider,Object>, ServiceLifetime)

              定义:public static ServiceDescriptor Describe (Type serviceType, Func<IServiceProvider,object> implementationFactory, ServiceLifetime lifetime);

              Describe(Type, Type, ServiceLifetime) :

              定义:public static Microsoft.Extensions.DependencyInjection.ServiceDescriptor Describe (Type serviceType, Type implementationType, Microsoft.Extensions.DependencyInjection.ServiceLifetime lifetime);


            (3)IServiceProvider   继承者有:
ServiceManagerLicenseContextINestedSiteISiteITypeDescriptorContext  

               IServiceProvider 只有一个方法:GetService(Type)  ---定义为 public object GetService (Type serviceType);   用于获取特定 Type 的服务对象。    

 

       //-----------除非你想更换内置的DI--------------------   

       4)配置依赖注入DI容器方法 :ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext,TContainerBuilder>)

           TContainerBuilder  没有找到定义。  除非你想更换内置的DI,如换成 AutoFac 框架。

 

2、ConfigureWebHostDefaults()   源代码

  https://github.com/aspnet/AspNetCore/blob/f676c249d25eb438ffc282edb551d86eea1d9709/src/DefaultBuilder/src/GenericHostBuilderExtensions.cs

     1)IWebHostBuilderWebHostBuilder  用于构建  IWebHost 

         其中有一特别的扩展方法及变化:UseStartup(IWebHostBuilder, String)  说明 含有 startup type 的 assembly。

       public static Microsoft.AspNetCore.Hosting.IWebHostBuilder UseStartup (this Microsoft.AspNetCore.Hosting.IWebHostBuilder hostBuilder, string startupAssemblyName);

        UseStartup<TStartup>(IWebHostBuilder)   、UseStartup(IWebHostBuilder, Type)

 

posted @ 2019-10-04 10:32  Hopesun  阅读(600)  评论(0编辑  收藏  举报