ASP.NET Core快速入门(第2章:配置管理)--学习笔记

点击蓝字关注我们

课程链接: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();
}
}
}

项目右键--调试--输入参数:name=mingsonzheng age=18

启动项目

默认参数

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", "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.dll
name: mingsonzheng
age: 18

PS D:\jessetalk\CommandLineSample\CommandLineSample\bin\Debug\netcoreapp2.1> dotnet CommandLineSample.dll name=jim age=22
name: jim
age: 22

任务11:Json文件配置

新建项目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();
}
}
}

启动项目

任务12:Bind读取配置到C#实例

新建ASP.NET Core Web 应用程序OptionsBindSample,直接选择 空,确定

在Startup.cs中通过依赖注入添加configuration

public IConfiguration Configuration { get; set; }

public Startup(IConfiguration configuration)
{
Configuration = configuration;
}

项目右键,新建项,添加一个类Class.cs

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; }
}
}

项目右键,新建项,添加一个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.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/?LinkID=398940
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");
//});

依赖注入配置添加MVC

services.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(IOptions<Class> classAccesser)
{
_myClass = classAccesser.Value;
}

public IActionResult Index()
{
return View(_myClass);
}
}
}

在Index中定义模型,输出

@model OptionsBindSample.Class
@{
ViewData["Title"] = "Index";
}

<h2>Index</h2>
<h4>Class No: @Model.ClassNo</h4>
<h4>Class Desc: @Model.ClassDesc</h4>
<h3>
Students:
</h3>
<div>
@foreach (var student in Model.Students)
{
<span>Name: @student.Name</span>
<span>Age: @student.Age</span>
}
</div>

注册Class,可以通过Configuration读取到option

services.Configure<Class>(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/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
// 注册Class,可以通过Configuration读取到option
services.Configure<Class>(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的代码有点多余,可以直接在视图中注入

Index

@using Microsoft.Extensions.Options;
@inject IOptions<OptionsBindSample.Class> ClassAccesser
@{
ViewData["Title"] = "Index";
}

<h2>Index</h2>
<h4>Class No: @ClassAccesser.Value.ClassNo</h4>
<h4>Class Desc: @ClassAccesser.Value.ClassDesc</h4>
<h3>
Students:
</h3>
<div>
@foreach (var student in ClassAccesser.Value.Students)
{
<span>Name: @student.Name</span>
<span>Age: @student.Age</span>
}
</div>

HomeController

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
{
public IActionResult Index()
{
return View();
}
}
}

启动项目得到同样结果

任务14:配置的热更新

ASP.NET修改web.config后站点会自动重启实现热更新

ASP.NET Core不同,实现如下:

将Index的这一行

@inject IOptions<OptionsBindSample.Class> ClassAccesser

修改为

@inject IOptionsSnapshot<OptionsBindSample.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)
.UseStartup<Startup>();

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); })
.UseStartup<Startup>();

启动项目,修改配置文件,保存,刷新网页,内容不会热更新

任务15:配置框架设计浅析

var builder = new ConfigurationBuilder();// 初始化Builder

builder.Add(source);// 将source添加到Builder
=>
JsonConfigurationSource source = new
JsonConfigurationSource()
{
Path = "settings.json";
};

var configurationRoot = builder.Build();// Build
=>
foreach(var source in sources)
{
var provider = source.Build();
providers.add(provider);
}
return new ConfigurationRoot(providers);

configurationRoot["Key"]// Use
=>
foreach(var provider in providers.Reverse())
{
string value;
provider.TryGet(Key, out Value)
return value;
}

点“在看”给我一朵小黄花

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下解压缩命令

在Linux下&#xff0c;很多时候我们需要对文件进行解压缩操作。尤其是在获取软件源码或安装包时&#xff0c;常常需要对文件进行解压操作。和Windows不同&#xff0c;Linux下的压缩文件形式更多、更复杂&#xff0c;操作方式往往以命令的形式进行。在此&#xff0c;对Linux下解…

怎么写技术简历?

作者&#xff1a;zollty&#xff0c;资深程序员和架构师&#xff0c;私底下是个爱折腾的技术极客&#xff0c;架构师社区合伙人&#xff01;纯手打&#xff0c;个人多年经验总结。&#xff08;本人的简历&#xff0c;历年来效果都不错&#xff0c;从校招到高端技术岗位、大厂技…

Linux/Unix下tar命令详解

tar命令是Linux/Unix系统下的打包压缩工具&#xff0c;可以将多个文件合并为一个文件&#xff0c;打包后的文件后缀为“.tar”。 这里首先需要明确两个概念&#xff1a;打包和压缩。打包是指将一大堆文件或目录合并成一个总的文件&#xff1b;压缩则是将一个大容量的文件通过一…

C# 代码中调用 Javascript 代码段以提高应用程序的配置灵活性(使用 Javascript .NET 与 Jint)...

一般来说&#xff0c;我们需要在开发应用软件的配置文件中&#xff0c;添加一些参数&#xff0c;用于后续用户根据实际情况&#xff0c;自行调整。配置参数&#xff0c;可以放在配置文件中、环境变量中、或数据库表中(如果使用了数据库的话)。通常&#xff0c;配置数据&#xf…

WebService的两种方式SOAP和REST比较

我的读后感&#xff1a;由于第一次接触WebService&#xff0c;对于很多概念不太理解&#xff0c;尤其是看到各个OpenAPI的不同提供方式时&#xff0c;更加疑惑。如google map api采用了AJAX方式&#xff0c;通过javascript提供API,而淘宝TOP则采用直接的HTTPXML请求方式&#x…

Web Service简介

Web Service是一种服务导向架构的技术&#xff0c;通过标准的Web协议提供服务&#xff0c;目的是保证不同平台的应用服务可以互操作。Web Service技术&#xff0c;能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件&#xff0c; 就可相互交换数据或集成…

Code Runner for VS Code 突破 1000 万下载量!支持运行超过 40 种语言

记得三年多前&#xff0c;韩老师那时还在写 PHP&#xff08;是的&#xff0c;没错&#xff01;在微软写 PHP&#xff09;&#xff0c;同时需要写 Python 和 Node.js 。所以在那时&#xff0c;支持多种语言的 VS Code 已经是笔者的主力编辑器了。唯一不足的是&#xff0c;韩老师…

Firefox UI已迁移至Web Components

这不是一项一蹴而就的工程&#xff0c;Mozilla 开发者表示团队花费了大约两年的时间&#xff0c;采用“增量更新”的方式才逐渐将 Firefox UI 迁移至使用 Web Components 构建。Mozilla 开发者 Brian Grinstead 在博客宣布&#xff0c;经过多年的努力&#xff0c;他已在几个星期…

Web Service和Servlet的区别

在最开始学习Web Service时候&#xff0c;总觉得Web Service和Servlet没有什么区别&#xff0c;觉得Servlet可以对Http请求进行相应并返回数据&#xff0c;而Web Service只不过是基于SOAP协议和XML对数据进行封装了&#xff0c;也是采用Http协议来传输数据&#xff0c;后来通过…

.Net线程同步技术解读

C#开发者(面试者)都会遇到lock(Monitor)&#xff0c;Mutex&#xff0c;Semaphore&#xff0c;SemaphoreSlim这四个与锁相关的C#类型&#xff0c;本文期望以最简洁明了的方式阐述四种对象的区别。什么是线程安全教条式理解如果代码在多线程环境中运行的结果与单线程运行结果一样…

.NET使用VS2010开发Web Service

Web Service是一个面向服务的架构&#xff08;SOA&#xff09;&#xff0c;不依赖于语言&#xff0c;不依赖于平台&#xff0c;可以实现不同的语言间的相互调用&#xff0c;通过Internet进行基于Http协议的网络应用间的交互。基于.NET平台&#xff0c;可以使用Visual Studio来开…

需求与问题——一个老现象

今天&#xff0c;和一个在成都的人谈了一个项目的情况&#xff0c;对方一直坚持他们对需求很清楚&#xff0c;我对他说&#xff0c;你们清楚的不是需求&#xff0c;你们清楚的只是问题或者说目标。过程是这样的&#xff1a;对方提到&#xff1a;目前的粮库经常生虫&#xff0c;…

Java 开发Web Service的几种方式

webservice的应用已经越来越广泛了&#xff0c;下面介绍几种在Java体系中开发webservice的方式&#xff0c;相当于做个记录。 1.Axis2 Axis是apache下一个开源的webservice开发组件&#xff0c;出现的算是比较早了&#xff0c;也比较成熟。这里主要介绍Axiseclipse开发webservi…

动手造轮子:实现简单的 EventQueue

动手造轮子&#xff1a;实现简单的 EventQueueIntro最近项目里有遇到一些并发的问题&#xff0c;想实现一个队列来将并发的请求一个一个串行处理&#xff0c;可以理解为使用消息队列处理并发问题&#xff0c;之前实现过一个简单的 EventBus&#xff0c;于是想在 EventBus 的基础…

Java开发Web Service的简介

随着异构系统互联需求的不断增加&#xff0c;Web Service的重要性也日益彰显出来。凭借Web Service&#xff0c;我们可以实现基于不同程序语言开发的项目之间的互联互通&#xff0c;Web Service也是面向服务的架构&#xff08;SOA&#xff09;的基石。其最主要的优点是&#xf…

【.NET Core 跨平台 GUI 开发】第二篇:Gtk# 布局入门,初识HBox 和 VBox

这是 Gtk# 系列博文的第二篇。在上一篇博文《编写你的第一个 Gtk# 应用》中&#xff0c;我们提到“一个 Gtk.Window 只能直接包含一个部件”。这意味着&#xff0c;在不做其他额外操作的情况下&#xff0c;如果你向一个 GtkWindow 中添加了一个 GtkLabel &#xff08;就像上一篇…

Java开发Web Service的几种解决方案

转自&#xff1a;http://blog.csdn.net/zolalad/article/details/25158995 Java开发中经常使用到的几种WebService技术实现方案 随着异构系统互联需求的不断增加&#xff0c;WebService的重要性也日益彰显出来。凭借webservice&#xff0c;我们可以实现基于不同程序语言的项目的…

【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用

本文是【.NET Core 跨平台 GUI 开发】系列博文的第一篇。该系列博文是一个关于 Gtk# 跨平台应用开发的初级随笔集合。该随笔集合介绍了 GTK 和 Gtk# 的基本信息以及开发方法&#xff0c;并展示了如何使用 .NET Core 技术栈开发基于 Gtk# 的跨平台 GUI 程序。博文假设你已经对 C…

ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记

点击蓝字关注我们课程链接&#xff1a;http://video.jessetalk.cn/course/explore良心课程&#xff0c;大家一起来学习哈&#xff01;任务22&#xff1a;课程介绍1.HTTP 处理过程2.WebHost 的配置与启动3.Middleware 与管道4.Routing MiddleWare 介绍任务23&#xff1a;Http请求…

Java使用JWS API开发Web Service

JAX-WS&#xff0c;即Java API for XML Web Service&#xff0c;是Java开发基于SOAP协议的Web Service的标准。使用JWS API就可以直接开发简单的Web Service应用。 一、创建Web Service 打开Eclipse&#xff0c;新建一个Java Project&#xff0c;如下图所示&#xff1a; 新建了…