网站开发 招聘,泉州效率网络网站建设,延吉市住房城乡建设局网站,网站开发增强骨密度的食品点击蓝字关注我们课程链接#xff1a;http://video.jessetalk.cn/course/explore良心课程#xff0c;大家一起来学习哈#xff01;任务9#xff1a;配置介绍命令行配置Json文件配置从配置文件文本到c#对象实例的映射 - Options 与 Bind配置文件热更新框架设计#xff1a;C… 点击蓝字关注我们课程链接http://video.jessetalk.cn/course/explore良心课程大家一起来学习哈任务9配置介绍命令行配置Json文件配置从配置文件文本到c#对象实例的映射 - Options 与 Bind配置文件热更新框架设计Configuration任务10命令行配置新建项目CommandLineSample--控制台应用.NET Core管理NuGet程序包--下载microsoft.aspnetcore.all传入参数using System;using Microsoft.Extensions.Configuration;namespace CommandLineSample{ class Program { static void Main(string[] args) { var builder new ConfigurationBuilder() .AddCommandLine(args); var configuration builder.Build(); Console.WriteLine($name: {configuration [name]}); Console.WriteLine($age: {configuration[age]}); Console.ReadLine(); } }}项目右键--调试--输入参数namemingsonzheng age18启动项目默认参数using System;using System.Collections.Generic;using Microsoft.Extensions.Configuration;namespace CommandLineSample{ class Program { static void Main(string[] args) { var settings new Dictionarystring, string { {name, mingsonzheng }, {age, 18 } }; var builder new ConfigurationBuilder() .AddInMemoryCollection(settings) .AddCommandLine(args); var configuration builder.Build(); Console.WriteLine($name: {configuration [name]}); Console.WriteLine($age: {configuration[age]}); Console.ReadLine(); } }}清空应用程序参数启动项目通过PowerShell运行程序默认参数与传入参数对比PS D:\jessetalk\CommandLineSample\CommandLineSample\bin\Debug\netcoreapp2.1 dotnet CommandLineSample.dllname: mingsonzhengage: 18PS D:\jessetalk\CommandLineSample\CommandLineSample\bin\Debug\netcoreapp2.1 dotnet CommandLineSample.dll namejim age22name: jimage: 22任务11Json文件配置新建项目JsonComfigSample--控制台应用.NET Core管理NuGet程序包--下载microsoft.aspnetcore.all添加Json文件项目右键--添加新建项class.json{ ClassNo: 1, ClassDesc: ASP.NET Core 101, Students: [ { name: mingsonzheng, age: 18 }, { name: jim, age: 28 }, { name: tom, age: 38 } ]}由于class.json不在bin\Debug目录下所以默认不会被编译文件右键属性修改为始终复制using System;using Microsoft.Extensions.Configuration;namespace JsonComfigSample{ class Program { static void Main(string[] args) { var builder new ConfigurationBuilder() .AddJsonFile(class.json); Console.ReadLine(); } }}启动项目可以看到class.json被复制到bin\Debug目录这样dll就可以读取到class.json文件读取json文件using System;using Microsoft.Extensions.Configuration;namespace JsonComfigSample{ class Program { static void Main(string[] args) { var builder new ConfigurationBuilder() .AddJsonFile(class.json); // 调用Build之前请确保拷贝的class.json文件没有格式错误 var configuration builder.Build(); Console.WriteLine($ClassNo: { configuration[ClassNo]}); Console.WriteLine($ClassDesc: { configuration[ClassDesc]}); Console.WriteLine(Students); Console.Write(configuration[Students:0:name]); Console.WriteLine(configuration[Students:0:age]); Console.Write(configuration[Students:1:name]); Console.WriteLine(configuration[Students:1:age]); Console.Write(configuration[Students:2:name]); Console.WriteLine(configuration[Students:2:age]); Console.ReadLine(); } }}启动项目任务12Bind读取配置到C#实例新建ASP.NET Core Web 应用程序OptionsBindSample直接选择 空确定在Startup.cs中通过依赖注入添加configurationpublic IConfiguration Configuration { get; set; }public Startup(IConfiguration configuration){ Configuration configuration;}项目右键新建项添加一个类Class.csusing System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;namespace OptionsBindSample{ public class Class { public int ClassNo { get; set; } public string ClassDesc { get; set; } public ListStudent Students { get; set; } } public class Student { public string Name { get; set; } public string Age { get; set; } }}项目右键新建项添加一个Json文件appsettings.json为什么取名appsettings.json呢因为Program.cs中的CreateDefaultBuilder默认读取一个名为appsettings.json的Json文件并把它的内容添加到配置文件拷贝前面的内容到appsettings.json{ ClassNo: 1, ClassDesc: ASP.NET Core 101, Students: [ { name: mingsonzheng, age: 18 }, { name: jim, age: 28 }, { name: tom, age: 38 } ]}在Startup.cs中通过Bind读取配置app.Run(async (context) { var myClass new Class(); Configuration.Bind(myClass);// 实现配置文件信息与对象的映射 await context.Response.WriteAsync($ClassNo: { myClass.ClassNo}); await context.Response.WriteAsync($ClassDesc: { myClass.ClassDesc}); await context.Response.WriteAsync($ {myClass.Students.Count } Students);});完整Startup.csusing System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;namespace OptionsBindSample{ public class Startup { public IConfiguration Configuration { get; set; } // 通过依赖注入添加configuration public Startup(IConfiguration configuration) { Configuration configuration; } // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID398940 public void ConfigureServices(IServiceCollection services) { } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.Run(async (context) { var myClass new Class(); Configuration.Bind(myClass);// Bind读取配置 await context.Response.WriteAsync($ClassNo: { myClass.ClassNo}); await context.Response.WriteAsync($ClassDesc: { myClass.ClassDesc}); await context.Response.WriteAsync($ {myClass.Students.Count } Students); }); } }}启动项目任务13在Core Mvc中使用Options在项目OptionsBindSample新建三个文件夹目录如下在Controllers文件夹右键添加一个控制器默认HomeController在Home文件夹右键添加一个视图默认Index在Startup.cs中注释掉这一段代码不然会把整个管道提交只输出这一段//app.Run(async (context) //{// var myClass new Class();// Configuration.Bind(myClass);// Bind读取配置// await context.Response.WriteAsync($ClassNo: { myClass.ClassNo});// await context.Response.WriteAsync($ClassDesc: { myClass.ClassDesc});// await context.Response.WriteAsync($ {myClass.Students.Count } Students);//});依赖注入配置添加MVCservices.AddMvc();使用默认路由app.UseMvcWithDefaultRoute();HomeController中通过IOptions方式依赖注入using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Options;namespace OptionsBindSample.Controllers{ public class HomeController : Controller { private readonly Class _myClass; // 通过IOptions方式依赖注入 public HomeController(IOptionsClass classAccesser) { _myClass classAccesser.Value; } public IActionResult Index() { return View(_myClass); } }}在Index中定义模型输出model OptionsBindSample.Class{ ViewData[Title] Index;}h2Index/h2h4Class No: Model.ClassNo/h4h4Class Desc: Model.ClassDesc/h4h3 Students:/h3div foreach (var student in Model.Students) { spanName: student.Name/span spanAge: student.Age/span }/div注册Class,可以通过Configuration读取到optionservices.ConfigureClass(Configuration);Startup.cs完整代码using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Http;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;namespace OptionsBindSample{ public class Startup { public IConfiguration Configuration { get; set; } // 通过依赖注入添加configuration public Startup(IConfiguration configuration) { Configuration configuration; } // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID398940 public void ConfigureServices(IServiceCollection services) { // 注册Class,可以通过Configuration读取到option services.ConfigureClass(Configuration); // 依赖注入配置添加MVC services.AddMvc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 使用默认路由 app.UseMvcWithDefaultRoute(); //app.Run(async (context) //{ // var myClass new Class(); // Configuration.Bind(myClass);// Bind读取配置 // await context.Response.WriteAsync($ClassNo: { myClass.ClassNo}); // await context.Response.WriteAsync($ClassDesc: { myClass.ClassDesc}); // await context.Response.WriteAsync($ {myClass.Students.Count } Students); //}); } }}启动项目如果仅仅在视图中使用options的话HomeController的代码有点多余可以直接在视图中注入Indexusing Microsoft.Extensions.Options;inject IOptionsOptionsBindSample.Class ClassAccesser{ ViewData[Title] Index;}h2Index/h2h4Class No: ClassAccesser.Value.ClassNo/h4h4Class Desc: ClassAccesser.Value.ClassDesc/h4h3 Students:/h3div foreach (var student in ClassAccesser.Value.Students) { spanName: student.Name/span spanAge: student.Age/span }/divHomeControllerusing System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Options;namespace OptionsBindSample.Controllers{ public class HomeController : Controller { public IActionResult Index() { return View(); } }}启动项目得到同样结果任务14配置的热更新ASP.NET修改web.config后站点会自动重启实现热更新ASP.NET Core不同实现如下将Index的这一行inject IOptionsOptionsBindSample.Class ClassAccesser修改为inject IOptionsSnapshotOptionsBindSample.Class ClassAccesser启动项目修改appsettings的ClassNo为222保存 ClassNo: 222,刷新网页实现原理对比控制台程序JsonComfigSample的Program读取配置文件 // 第二个参数表示文件不存在时是否抛异常 // 第三个参数表示配置文件更新的时候是否重新加载 var builder new ConfigurationBuilder() .AddJsonFile(class.json,false,true);而在ASP.NET Core程序OptionsBindSample在Program中的CreateDefaultBuilder的源码实现了 public static IWebHostBuilder CreateWebHostBuilder(string[] args) WebHost.CreateDefaultBuilder(args) .UseStartupStartup();WebHost源码https://github.com/aspnet/MetaPackages/blob/master/src/Microsoft.AspNetCore/WebHost.cs源码里面实现热更新165行config.AddJsonFile(appsettings.json, optional: true, reloadOnChange: true) .AddJsonFile($appsettings.{env.EnvironmentName}.json, optional: true, reloadOnChange: true);由于它是WebHostBuilder的一个扩展函数所以可以覆盖该方法public static IWebHostBuilder CreateWebHostBuilder(string[] args) WebHost.CreateDefaultBuilder(args) // 如果业务场景不需要一个线程一直关注配置文件变更可以关闭热更新 .ConfigureAppConfiguration(config { config.AddJsonFile(appsettings.json, false, false); }) .UseStartupStartup();启动项目修改配置文件保存刷新网页内容不会热更新任务15配置框架设计浅析var builder new ConfigurationBuilder();// 初始化Builderbuilder.Add(source);// 将source添加到BuilderJsonConfigurationSource source newJsonConfigurationSource(){ Path settings.json;};var configurationRoot builder.Build();// Buildforeach(var source in sources){ var provider source.Build(); providers.add(provider);}return new ConfigurationRoot(providers);configurationRoot[Key]// Useforeach(var provider in providers.Reverse()){ string value; provider.TryGet(Key, out Value) return value;}点“在看”给我一朵小黄花