IHostBuilder UseServiceProviderFactoryTContainerBuilder(Fun
标签:
一、一切从新开始简述:知道工作的底细就应该从新 开始,下面我们代码先行
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<Startup>(); }); }
可见,关键是我们需要研究CreateHostBuilder整个要领内部做了什么,不要简单地看这个要领,真实情况涉及很深.本文简化很多问题来说明
二、先让我们熟悉几个数据布局2.1 IHostBuilder (暂时写这一个,后续再增加)
public interface IHostBuilder { IDictionary<object, object> Properties { get; } //宿主措施的配置 IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate); //应用措施的配置 IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate); //添加service到容器 IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate); IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory); //笼罩用于创建ServiceProvider的工厂。 IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory); / /配置依赖注入的容器 IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate); IHost Build(); }
得出简要的分析和猜度:CreateHostBuilder中设置Asp.net core中所需诸多原始素材:配置信息(包孕环境等),IOC所需的各种素材,创建web措施所需的宿主WebHost然后将上面的素材同时传给WebHost.......
三、CreateDefaultBuilder要领内部做了什么
public static IHostBuilder CreateDefaultBuilder(string[] args)
{
HostBuilder hostBuilder = new HostBuilder();
hostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
//设置Host的配置信息
hostBuilder.ConfigureHostConfiguration((Action<IConfigurationBuilder>)delegate(IConfigurationBuilder config)
{
config.AddEnvironmentVariables("DOTNET_");
if (args != null)
{
config.AddCommandLine(args);
}
});
//设置应用措施的配置信息
hostBuilder.ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)delegate(HostBuilderContext hostingContext, IConfigurationBuilder config)
{
IHostEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile("appsettings." + hostingEnvironment.EnvironmentName + ".json", optional: true, reloadOnChange: true);
if (hostingEnvironment.IsDevelopment() && !string.IsNullOrEmpty(hostingEnvironment.ApplicationName))
{
Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
if (assembly != null)
{
config.AddUserSecrets(assembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})//设置日志的相关配置
.ConfigureLogging((Action<HostBuilderContext, ILoggingBuilder>)delegate(HostBuilderContext hostingContext, ILoggingBuilder logging)
{
bool num = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
if (num)
{
logging.AddFilter<EventLogLoggerProvider>((LogLevel level) => level >= LogLevel.Warning);
}
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
if (num)
{
logging.AddEventLog();
}
}).UseDefaultServiceProvider((Action<HostBuilderContext, ServiceProviderOptions>)delegate(HostBuilderContext context, ServiceProviderOptions options)
{
bool validateOnBuild = options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
options.ValidateOnBuild = validateOnBuild;
});
return hostBuilder;
}
我们先总结一些常识点和注意事项
1.措施的默认的根目录给与了Directory.GetCurrentDirectory()也就是Environment.CurrentDirectory,那么这意味着我们在用其它措施启动应用时需要手动指定当前事情目录,制止产生变革.
2.asp.net core中两个路径的区别
ContentRoot: C:\MyApp\wwwroot WebRoot: C:\MyApp\wwwroot\wwwroot
3.asp.net core中配置文件的优先级问题
命令行>环境变量>自我订制的配置(AddUserSecrets)>和当前环境相匹配的appsettings.json中的配置>大于appsettings.json中的配置
关于AddUserSecrets是什么这里简单一言以蔽之:每个开发人员有本身特性的配置数据,这些配置信息仅仅属于小我私家,不能提交给团队成员,
但是又不想不团队共有的配置所影响. 剩下的自行去了解,关键是上面的优先级
和当前环境相匹配的appsettings.json如appsettings.Development.json
4.系统会默认添加日志行为如下
a.windows会添加事件(level >= LogLevel.Warning)
b.默认会将给与appsettings.json中Logging节点下的配置情况
c.日志信息默认会显示咋控制台和调试中
四、 Startup 类主要感化:配置处事和应用的请求管道。ASP.NET Core 凭据约定定名为 Startup作为 Startup 类:
1.可选择性地包孕 ConfigureServices 要领以配置应用的处事 。 处事是一个供给应用成果的可重用组件。
在 ConfigureServices 中注册处事,并通过依赖关系注入 (DI) 或 ApplicationServices 在整个应用中使用处事 。
2.包孕 Configure 要领以创建应用的请求措置惩罚惩罚管道。
在启动时,ASP.NET Core会挪用 ConfigureServices 和 Configure:
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30544.html