命令行配置
我们通过vs2017创建一个控制台项目CommandLineSample
![](https://yqfile.alicdn.com/img_414bd9584d1354264d598c1713e87d66.png?x-oss-process=image/resize,w_1400/format,webp)
可以看到现在项目以来的是dotnet core framework
![](https://yqfile.alicdn.com/img_1ed491367d171f708f420b32458e3683.png?x-oss-process=image/resize,w_1400/format,webp)
我们需要吧
asp.net core引用进来,我们可以直接添加Microsoft.AspNetCore.All
![](https://yqfile.alicdn.com/img_08cec8a694725ccd4de3f45b153c1896.png?x-oss-process=image/resize,w_1400/format,webp)
安装完成之后,我们可以通过using Microsoft.Extensions.Configuration;来进行后续的配置
static void Main(string[] args) { var builder = new ConfigurationBuilder()//初始化一个ConfigurationBuilder .AddCommandLine(args);//扩展函数 var configuration = builder.Build();//拿到configuration //查看configuration里面有什么 Console.WriteLine($"name:{configuration["name"]}"); Console.WriteLine($"age:{configuration["age"]}"); Console.ReadLine(); }
这时候直接执行的话不会有结果,因为我们没有对configuration进行配置
![](https://yqfile.alicdn.com/img_8235f77d8514f3b798bc4c0d41966f99.png?x-oss-process=image/resize,w_1400/format,webp)
我们可以在调试里面进行参数配置,运行结果
![](https://yqfile.alicdn.com/img_1fa55d11c109bcdfd361328bd7f7e339.png?x-oss-process=image/resize,w_1400/format,webp)
configuration一般以键值对的形式存在,我们如果要给他传递默认的参数的话,可以用一个dictionary来传递,然后以内存的形式添加进去
using System; using System.Collections.Generic; using Microsoft.Extensions.Configuration; namespace CommandLineSample { class Program { static void Main(string[] args) { var settings = new Dictionary<string, string> { {"name","菜鸟起飞"}, {"age","18"} }; var builder = new ConfigurationBuilder()//初始化一个ConfigurationBuilder .AddInMemoryCollection(settings)//以内存的形式添加进来 .AddCommandLine(args);//扩展函数 var configuration = builder.Build();//拿到configuration //查看configuration里面有什么 Console.WriteLine($"name:{configuration["name"]}"); Console.WriteLine($"age:{configuration["age"]}"); Console.ReadLine(); } } }
这个时候我们就可以将调试里面的参数去掉了,直接用控制台启动项目,可以看到传递参数和不传递参数会有不同的配置显示效果
![](https://yqfile.alicdn.com/img_b005bf8888b17804ab6ff0a85f293f93.png?x-oss-process=image/resize,w_1400/format,webp)
Json文件配置
新建控制台项目JsonConfigSample
我们需要吧
asp.net core引用进来,我们可以直接添加Microsoft.AspNetCore.All
然后新建json文件 class.json 并生成到bin
{ "ClassNo": "1", "ClassDesc": "菜鸟入门ASP.NET Core", "Students": [ { "name": "老王", "age": "17" }, { "name": "老李", "age": "16" }, { "name": "老牛", "age": "17" } ] }
然后读取class.json文件,读取结果
![](https://yqfile.alicdn.com/img_64f68b4cccbe280bb433f884dc9ff423.png?x-oss-process=image/resize,w_1400/format,webp)
Bind读取配置到C#实例
新建控制台项目OptionsBindSample
![](https://yqfile.alicdn.com/img_ad94bf05aba4a1f8a5651721ff143f95.png?x-oss-process=image/resize,w_1400/format,webp)
选择空的模板
![](https://yqfile.alicdn.com/img_f376d6ad20eb8aebc0b4dab839bb04d1.png?x-oss-process=image/resize,w_1400/format,webp)
这个时候创建的Startup.cs文件中没有Configuration,由于我们要用到Configuration,所以我们要用到依赖注入,把Configuration加进来
![](https://yqfile.alicdn.com/img_7828160364606822faa0d0b0bb578cb0.png?x-oss-process=image/resize,w_1400/format,webp)
这个时候我们就可以在Startup.cs中使用Configuration了
新建Class.class班级类
using 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 List<Student> Students { get; set; } } public class Student { public string Name { get; set; } public string Age { get; set; } } }
添加asp.net配置文件appsettings.json
{ "ClassNo": "1", "ClassDesc": "菜鸟入门ASP.NET Core", "Students": [ { "name": "老王", "age": "17" }, { "name": "老李", "age": "16" }, { "name": "老牛", "age": "17" } ] }
为什么要添加配置文件呢?我们可以看下图:因为在WebHost启动的时候默认是没有添加配置文件的,但是当项目启动的时候,我们会默认读取appsettings.json这里的内容到Configuration里面去,是通过CreateDefaultBuilder这个方法把他们加载进去的
![](https://yqfile.alicdn.com/img_d27f2b4e3b9cb8d434216af05901e948.png?x-oss-process=image/resize,w_1400/format,webp)
这时候我们可以在Startup.cs当中将读取的appsetting的Configuration绑定到对应的Class实例化模型,并打印出来,运行后现实吧效果,显示的格式忘调了,各位可以尝试自己去调一调
![](https://yqfile.alicdn.com/img_1c71e5346d9c6458412c8d6eac9caddc.png?x-oss-process=image/resize,w_1400/format,webp)
在Core Mvc中使用Options
添加MVC中间件(Middleware)
首先,我们在前面的OptionsBindSample项目中新建文件夹:Controllers、Views。添加一个HomeController。给HomeController的Index动作添加Index视图,
接下来在Startup.cs中注释掉以下内容,因为如果不注释的话管道会一直被占用,导致我们的mvc无法访问
然后在Startup.cs的ConfigureServices方法中添加mvc
接下来在Startup.cs的Configure方法中配置使用MVC默认路由
![](https://yqfile.alicdn.com/img_dd9cdda2d8ece70e9860ed1e17e4b993.png?x-oss-process=image/resize,w_1400/format,webp)
控制器依赖注入
通过依赖注入的方式在HomeController中注入myClass。只不过这次我们不能用bing的方法,而是用IOption<T>泛型方法将班级注入进去
![](https://yqfile.alicdn.com/img_8985631cb0e92ce0a5f55baa9127438e.png?x-oss-process=image/resize,w_1400/format,webp)
这时候我们返回强类型视图
![](https://yqfile.alicdn.com/img_02a6dc12749bb708d14511dfb9ebd2b9.png?x-oss-process=image/resize,w_1400/format,webp)
依赖注入和视图完成之后呢,我们要在Startup.cs的ConfigureServices方法中注册一下Class到Options,将Configuration传进去,这样在HomeController调用IOptions<Class>的时候,才会能从配置中拿到Class的内容
![](https://yqfile.alicdn.com/img_2a39d1a44e4f0cff8c812ba86986fd7a.png?x-oss-process=image/resize,w_1400/format,webp)
启动之后效果
![](https://yqfile.alicdn.com/img_6161355edf2f7c97de47fc6b74c9d0ba.png?x-oss-process=image/resize,w_1400/format,webp)
【小扩展】:我们也可以把注入直接取出来,通过依赖注入框架直接在视图中显示出来
新建控制器Home2Controller,不需要添加任何依赖注入的配置。创建Index视图,直接在视图中引用IOtions<T>以强类型视图的方式注入进去
![](https://yqfile.alicdn.com/img_9203b038c0454e31123efab0545de170.png?x-oss-process=image/resize,w_1400/format,webp)
运行效果
![](https://yqfile.alicdn.com/img_be4e7847b00aa45b69ac509d5ee097d0.png?x-oss-process=image/resize,w_1400/format,webp)
谈一谈 Program.cs中的BuildWebHost方法
当我们创建mvc项目的时候,自动创建的Program.cs中的BuildWebHost是下面这个样子的,无法访问其他的*,json配置文件
![](https://yqfile.alicdn.com/img_8ebf56aec6dd71f4bf6ba67655ad2a69.png?x-oss-process=image/resize,w_1400/format,webp)
对其进行修改来读取特定的*.json配置文件
![](https://yqfile.alicdn.com/img_9b7de23b0bb06c3d477f4d69c9c5d031.png?x-oss-process=image/resize,w_1400/format,webp)