Net Core 3.0 及 AspNet 3.0
收集1、200行代码,7个对象——让你了解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
设置默认给 IWebHostBuilder: 使用 Kestrel,配置 application's configuration providers, 增加 HostFiltering 中间件, 增加 ForwardedHeaders 中间件,如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED=true, 使能 IIS 集成。
------------------------------------------------------------------------------------------------
1、HostBuilder、IHostBuilder 建造器: 可以使用 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>(实现有多个: 其中 前二个是面向文件的,后面三个简单些
(5)疑问:最后结果是要获得:IConfigurationRoot 或 IConfiguration,需要 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) IServiceCollection、ServiceCollection : 实现 IList<ServiceDescriptor>等,并通过ServiceDescriptor 描述的服务约定。
加入集合的方法,全部都是扩展方法(接口扩展):举例参考
AddWebEncoders(IServiceCollection)
Add(IServiceCollection, ServiceDescriptor)
(2)ServiceDescriptor 描述 服务 service 的 type, implementation, lifetime。
有ServiceType、ImplementationType、ImplementationFactory、ImplementationInstance、Lifetime 五个只读属性,通过构造器初始化获得。
有很多以 :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 继承者有:ServiceManager、LicenseContext、INestedSite、ISite、ITypeDescriptorContext
IServiceProvider 只有一个方法:GetService(Type) ---定义为 public object GetService (Type serviceType); 用于获取特定 Type 的服务对象。
//-----------除非你想更换内置的DI--------------------
4)配置依赖注入DI容器方法 :ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext,TContainerBuilder>)
TContainerBuilder 没有找到定义。 除非你想更换内置的DI,如换成 AutoFac 框架。
2、ConfigureWebHostDefaults() 源代码
1)IWebHostBuilder、WebHostBuilder 用于构建 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)