当前位置: 首页 > news >正文

电子商务网站建设的成本分析wordpress房产企业模板免费下载

电子商务网站建设的成本分析,wordpress房产企业模板免费下载,一个做微信文章的网站,为自己网站建设前言在之前的文章.Net Core Configuration源码探究一文中我们曾解读过Configuration的工作原理#xff0c;也.Net Core Configuration Etcd数据源一文中探讨过为Configuration自定义数据源需要哪些操作。由于Configuration配置系统也是.Net Core的核心#xff0c;其中也包含了… 前言    在之前的文章.Net Core Configuration源码探究一文中我们曾解读过Configuration的工作原理也.Net Core Configuration Etcd数据源一文中探讨过为Configuration自定义数据源需要哪些操作。由于Configuration配置系统也是.Net Core的核心其中也包含了许多细节其中通过启动命令行CommandLine、环境变量、配置文件或定义其他数据源的形式其实都是适配到配置系统中我们都可以通过Configuration去读取它们的数据但是在程序默认的情况下他们读取的优先级到底是怎么样的呢接下来我们就一起来研究一下。代码演示由于Configuration数据操作是我们实操代码过程中不可或缺的环节所以我们先通过代码的形式来看一下它的读取顺序到底是什么样子的首先我们建立一个示例在这个示例中我们分别在常用配置数据的地方CommandLine、环境变量、appsettings.json、ConfigureWebHostDefaults中的UseSetting和ConfigureAppConfiguration中读取自定义的文件mysettings.json中分别设置一个同名的配置节点叫FromSource然后它的值设置FromSource节点的数据来自于哪个配置方式比如环境变量中我配置的是EnvironmentMyDemo.Config: {commandName: Project,launchBrowser: true,applicationUrl: http://localhost:19573,environmentVariables: {ASPNETCORE_ENVIRONMENT: Development,FromSource: Environment} 配置文件中我配置的是appsetting.json{Logging: {LogLevel: {Default: Information,Microsoft: Warning,Microsoft.Hosting.Lifetime: Information}},AllowedHosts: *,FromSource: appsetting.json } 自定义的配置文件中我配置的是mysettings.json{FromSource: mysetting.json } 然后在启动程序Program.cs中配置如下public static IHostBuilder CreateHostBuilder(string[] args) Host.CreateDefaultBuilder(args).ConfigureAppConfiguration(config {config.AddJsonFile(mysettings.json, optional: true, reloadOnChange: true);}).ConfigureWebHostDefaults(webBuilder {webBuilder.UseSetting(FromSource, UseSetting);webBuilder.UseStartupStartup();}); 为了方便演示我们在程序的默认终结点中添加响应的读取代码app.UseEndpoints(endpoints {endpoints.MapGet(/, async context {await context.Response.WriteAsync($Read Node FromSource{Configration[FromSource]});}); }); 以上操作我们都完成了配置后然后通过CLI的方式启动程序并传递--FromSourceCommandLinedotnet run --FromSourceCommandLine 程序运行起来之后输入hostport的形式请求默认路径得到的结果是Read Node FromSourcemysetting.json 说明默认情况下优先级最高的是通过ConfigureAppConfiguration方法注册自定义配置然后我们注释掉设置读取mysetting.json数据源的相关代码然后继续运行程序,得到的结果是Read Node FromSourceCommandLine 这个是通过CLI启动程序我们手动传递的命令行参数然后我们退出程序再次通过CLI的方式运行程序但是这次我们不传递--FromSourceCommandLine得到的结果是Read Node FromSourceEnvironment 这是我们在环境变量中配置的节点数据然后我们注释掉在环境变量中配置的节点数据再次启动程序得到的结果是Read Node FromSourceappsetting.json 也就是我们在默认配置文件中appsetting.json配置的数据然后我们注释掉这个数据节点继续运行程序毫无疑问得到的结果是Read Node FromSourceUseSetting 通过这个演示结果我们可以得到这么一个结论在Asp.Net Core中如果你采用的是系统默认的形式构建的程序那么读取配置节点的优先级是ConfigureAppConfiguration(自定义读取)CommandLine(命令行参数)Environment(环境变量)appsetting.json(默认配置文件)UseSetting的顺序。源码探究要想知道为什么演示示例会出现那种顺序还要从源码着手。在之前的.Net Core Configuration源码探究中我们提到过Configuration读取数据的顺序采用的是后来者居上的形式也就是说后被注册的ConfigurationProvider中的数据会优先被读取到这个操作处理在ConfigurationRoot类中可以找到相关逻辑[点击查看源码????]它的实现是这样的public string this[string key] {get{//通过这个我们可以了解到读取的顺序取决于注册Source的顺序采用的是后来者居上的方式//后注册的会先被读取到如果读取到直接returnfor (var i _providers.Count - 1; i 0; i--){var provider _providers[i];if (provider.TryGet(key, out var value)){return value;}}return null;}set{if (!_providers.Any()){throw new InvalidOperationException(Resources.Error_NoSources);}//这里的设置只是把值放到内存中去并不会持久化到相关数据源foreach (var provider in _providers){provider.Set(key, value);}} } 通过这段代码我们就心理就有底了也就是说上面示例表现出来的现象无非就是注册顺序的问题。默认的CreateDefaultBuilder默认情况下我们都是通过Host.CreateDefaultBuilder(args)的方式去构建的HostBuilder那么我们就从这个方法入手找到源码位置????我们抽离出关于配置操作的逻辑大致如下public static IHostBuilder CreateDefaultBuilder(string[] args) {var builder new HostBuilder();//配置默认内容根目录为当前程序运行目录builder.UseContentRoot(Directory.GetCurrentDirectory());//配置HostConfiguration,这个地方不要被吓到最终通过HostConfiguration配置的操作都是要加载到ConfigureAppConfiguration里的//至于如何加载待会我们会通过源码看到builder.ConfigureHostConfiguration(config {//先配置环境变量config.AddEnvironmentVariables(prefix: DOTNET_);//然后配置命令行读取if (args ! null){config.AddCommandLine(args);}});builder.ConfigureAppConfiguration((hostingContext, config) {var env hostingContext.HostingEnvironment;//首先添加的就是读取appsettings.json相关config.AddJsonFile(appsettings.json, optional: true, reloadOnChange: true).AddJsonFile($appsettings.{env.EnvironmentName}.json, optional: true, reloadOnChange: true);if (env.IsDevelopment() !string.IsNullOrEmpty(env.ApplicationName)){var appAssembly Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly ! null){config.AddUserSecrets(appAssembly, optional: true);}}//添加环境变量配置读取相关config.AddEnvironmentVariables();//启动时命令行参数不为null则添加CommandLine读取if (args ! null){config.AddCommandLine(args);}})//*其他部分逻辑已省略有兴趣可自行点击上方连接查看源码return builder; } 通过CreateDefaultBuilder我们可以非常清晰的得到这个结论由于先注册的是读取appsettings.json相关的逻辑然后是AddEnvironmentVariables去读取环境变量最后是AddCommandLine读取命令行参数加载到Configuration中所以通过这个我们验证了优先级CommandLine(命令行参数)Environment(环境变量)appsetting.json(默认配置文件)的顺序。ConfigureAppConfiguration中寻找答案通过上面CreateDefaultBuilder我们得到了Configuration默认读取优先级的一部分逻辑认证但是在示例的演示中我们清楚的看到ConfigureAppConfiguration中配置的读取优先级是大于以上任何一个读取方式的所以接下来我们还得需要到ConfigureAppConfiguration方法中一探究竟这是一个扩展方法默认调用的是HostBuilder中的ConfigureAppConfiguration方法[点击查看源码????]public IHostBuilder ConfigureAppConfiguration(ActionHostBuilderContext, IConfigurationBuilder configureDelegate) {_configureAppConfigActions.Add(configureDelegate ?? throw new ArgumentNullException(nameof(configureDelegate)));return this; } _configureAppConfigActions是HostBuilder的私有属性private ListActionHostBuilderContext, IConfigurationBuilder _configureAppConfigActions new ListActionHostBuilderContext, IConfigurationBuilder(); 也就是说我们通过ConfigureAppConfiguration实现的逻辑都会被添加到_configureAppConfigActions这个List中但是这个还不是我们要查找的核心。看来我们要去HostBuilder.Build()方法找寻找答案了毕竟真正的构建逻辑还是在Build方法中最后我们找到了如下方法[点击查看源码????]private void BuildAppConfiguration() {//用默认的ContentRootPath去构建一个全局的ConfigurationBuildervar configBuilder new ConfigurationBuilder().SetBasePath(_hostingEnvironment.ContentRootPath)//首先就是把通过ConfigureHostConfiguration配置的相关添加到ConfigurationBuilder中.AddConfiguration(_hostConfiguration, shouldDisposeConfiguration: true);//通过循环的方式去执行我们注册到_configureAppConfigActions集合中的逻辑foreach (var buildAction in _configureAppConfigActions){buildAction(_hostBuilderContext, configBuilder);}_appConfiguration configBuilder.Build();_hostBuilderContext.Configuration _appConfiguration; } 由于_configureAppConfigActions是被循环执行的也就是说先被注册到ConfigureAppConfiguration中的逻辑也是优先被执行那么我们在CreateDefaultBuilder方法中系统默认给我注册的AddJsonFile、AddEnvironmentVariables、AddCommandLine的调用顺序要优先于我们自行通过ConfigureAppConfiguration注册配置的逻辑。由于Configuration读取数据的顺序采用的是后来者居上的形式所以我们自行通过ConfigureAppConfiguration注册的配置逻辑优先级是大于系统默认给我们注册读取配置的优先级。因此通过这些我们可以得到了这个结论ConfigureAppConfiguration(自定义读取)CommandLine(命令行参数)Environment(环境变量)appsetting.json(默认配置文件)。除此之外还可以得到一个结论默认情况下通过ConfigureHostConfiguration添加的配置相关优先级是最低的。因为在循环执行_configureAppConfigActions循环之前也就是在构建ConfigurationBuilder的时候就添加了ConfigureHostConfiguration。UseSetting最后的迷雾通过上面的相关源码我们已经得到了关于默认配置读取优先级的大部分实现逻辑仅仅剩下通过ConfigureWebHostDefaults中添加的UseSetting相关逻辑。可能有许多同学不清楚其实UseSetting也是添加到配置系统当中去的这个可以查看具体源码[点击查看源码????]private IConfiguration _config new ConfigurationBuilder().AddEnvironmentVariables(prefix: ASPNETCORE_).Build(); public IWebHostBuilder UseSetting(string key, string value) {_config[key] value;return this; } 也就是说接下来我们只要找到_config是如何注册到全局的ConfigurationBuilder中就能拨开最后的迷雾找到真正的答案。我们通过入口方法ConfigureWebHostDefaults往下找虽然过程有点曲折但是我们还是在GenericWebHostBuilder的构造函数中找到了如下逻辑逻辑[点击查看源码????]public GenericWebHostBuilder(IHostBuilder builder) {_builder builder;//这个就是上面UseSetting操作的_config_config new ConfigurationBuilder().AddEnvironmentVariables(prefix: ASPNETCORE_).Build();//把_config通过ConfigureHostConfiguration方法注册到了全局的ConfigurationBuilder中去_builder.ConfigureHostConfiguration(config {config.AddConfiguration(_config);ExecuteHostingStartups();});//*其他部分代码省略 } 看到这个逻辑突然就恍然大悟了我们上面曾经说过通过ConfigureHostConfiguration添加的配置相关优先级是最低的。因为在HostBuilder.Build()调用的BuildAppConfiguration方法中我们可以得知在循环执行_configureAppConfigActions循环之前也就是在构建ConfigurationBuilder的时候就添加了ConfigureHostConfiguration。而UseSetting操作的Configuration正是通过ConfigureHostConfiguration注册到ConfigurationBuilder中去的因此通过UseSetting添加的配置相关优先级要低于之前我们提到的其他配置逻辑。总结    通过本次谈到我们得到了默认情况下读取配置Configuration的默认优先级也就是ConfigureAppConfiguration(自定义读取)CommandLine(命令行参数)Environment(环境变量)appsetting.json(默认配置文件)UseSetting的顺序。然后我们通过分析源码的形式得到了为什么会是这个读取优先级的缘由。总之还是脱离不了那个宗旨Configuration读取数据的顺序采用的是后来者居上的形式后被注册的会优先被读取到。    说点题外话我觉得阅读源码是一件非常有趣的事情不是说我要把所有源码看一遍或者都能看懂。而是当我心理产生了疑惑但是这个疑惑我通过阅读源码的途径变得豁然开朗这才是读源码真正的乐趣所在。漫无目的或者为了读而读会失去兴趣所在容易导致效率低下看明白了源码的设计提升了自己的思维方式也许才是真正的自我提升。????欢迎扫码关注我的公众号????
http://wiki.neutronadmin.com/news/327379/

相关文章:

  • 中企做一个网站多少钱长沙网站制作哪
  • 云建站自动建站系统源码网站升级及政务新媒体建设方案
  • 徐州模板自助建站wordpress导航菜单栏
  • 规划案例网站本科毕业设计代做网站
  • 网站做多久才有流量佛山网站建设服务商
  • 大学生做兼职的网站有哪些如何提升网站pr值
  • 杭州网站建设网站制作wordpress防止机器评论
  • 优化游戏的软件优化方案化学
  • 赤水市建设局官方网站wordpress 黄聪
  • 深圳企业网站建设哪家好网站外链建设需要考核
  • 平凉哪有做网站的北京最大公司排名
  • 北京网站制作报价html响应式网页设计代码范文
  • 文安做网站个人网站与企业网站
  • 汕头网络推广平台搜索引擎优化的目标
  • 怎么看网站哪个公司做的十大免费网站推广平台
  • 海南省建设网站的公司电话号码增城网站建设方案
  • 信用网站建设招标书wordpress 侧栏主题
  • 应持续抓好二级网站的建设工作黑龙江省和城乡建设厅网站
  • 网站后台更新内容后建筑设计有哪些专业
  • 网站建设与管理的专业群深圳建设局网站首页
  • 阿里云加WordPress建站成都网站制作-中国互联
  • 中国市场营销网网站搜索引擎优化总结感悟
  • 做网站的公司周年活动公司的网站如何建设
  • 电子商务网站建设复习题公共体育课程网站建设
  • 设计素材网站月收益漳州北京网站建设
  • 西安手机网站制作南京网站建设优化
  • 上海城乡建设部网站首页wordpress 公式
  • 通河新村街道网站建设线下推广活动有哪些
  • 淮阳网站建设小程序怎么开发自己的小程序代码
  • 效果图网站有哪些做网站加班