06选项模式
选项模式使用类来提供对相关设置组的强类型访问。 当配置设置由方案隔离到单独的类时,应用遵循两个重要软件工程原则:
封装:依赖于配置设置的类仅依赖于其使用的配置设置
分离关注点:应用的不同部件的设置不彼此依赖或相互耦合
绑定分层配置
读取相关配置值的首选方法是使用选项模式。 例如,若要读取以下配置值,请执行以下操作:
appsettings.jsonPositionOptions通过Bind()方式通过Get()方式(推荐)123456{ "Position": { "Title": "Editor", "Name": "Joe Smith" }} 选项类:
必须是包含公共无参数构造函数的非抽象类。
类型的所有公共读写属性都已绑定。
字段不是绑定的。 在下面的代码中,Position 未绑定。 由于使用了 Position 字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 “Posi ...
05配置
ASP.NET Core中的应用程序配置是使用一个或多个配置提供程序执行的。配置提供程序使用各种配置源从键值对读取配置数据:
配置文件,例如appsettings.json
环境变量
Azure Key Vault
Azure 应用配置
命令行参数
已安装或已创建的自定义提供程序
目录文件
内存中的.NET对象
应用程序和主机配置
ASP.NET Core 应用配置和启动“主机”。 主机负责应用程序启动和生存期管理。 ASP.NET Core 模板创建的 WebApplicationBuilder 包含主机。 虽然可以在主机和应用程序配置提供程序中完成一些配置,但通常,只有主机必需的配置才应在主机配置中完成。
默认应用程序配置源
1var builder = WebApplication.CreateBuilder(args);
WebApplication.CreateBuilder 使用预配置的默认值初始化 WebApplicationBuilder 类的新实例。 经过初始化的 WebApplicationBuilder (builder) 按照以下顺序为应用提供默 ...
04主机
配置相关
URL&Port
设置端口
Properties/launchSettings.json 文件,该文件指定应用响应的端口。或通过如下方式:
12345var app = WebApplication.Create(args);app.MapGet("/", () => "Hello World!");app.Run("http://localhost:3000");
设置多个端口
在以下代码中,应用响应端口 3000 和 4000。
12345678var app = WebApplication.Create(args);app.Urls.Add("http://localhost:3000");app.Urls.Add("http://localhost:4000");app.MapGet("/", () => "Hello World");app.Run();
从命令行设置端口
以下命令使应用响应端口 ...
03中间件
中间件是一种装配到应用管道以处理请求和响应的组件,每个组件:
选择是否将请求传递到管道中的下一个组件
可在管道中的下一个组件前后执行工作
请求委托用于生成请求管道。请求委托处理每个HTTP请求。
使用RunMap和Use扩展方法来配置请求委托。可将一个单独的请求委托并行指定为匿名方法(称为并行中间件),或在可重用的类中对其进行定义。这些可重用的类和并行匿名方法即为中间件,也叫做中间件组件。请求管道中的每个中间件组件负责调用管道中的下一个组件,或使管道短路。当中间件短路时,它被称为“终端中间件”,因为它阻止中间件进一步处理请求。
ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。
通过以下示例观察中间件的执行过程
12345678910111213141516171819202122232425var builder = WebApplication.CreateBuilder(args);var app = builder.Build();app.Use(async(context,next)=>& ...
02依赖注入
ASP.NET Core支持依赖关系注入(DI)软件设计模式,这是一种在类及其依赖关系之间实现控制反转(IOC)的技术。
依赖关系注入概述
依赖项是指另一个对象所依赖的对象。
12345678910public class IndexModel : PageModel{ // 直接实例化MyDependency类(直接依赖) private readonly MyDependency _dependency = new MyDependency(); public void OnGet() { _dependency.WriteMessage("IndexModel.OnGet"); }}
在上述示例中,创建并直接依赖于 MyDependency 类。 代码依赖项会产生问题,应避免使用,原因如下:
要用不同的实现替换 MyDependency,必须修改 IndexModel 类。
如果 MyDependency 具有依赖项,则必须由 IndexModel 类对其进行配置 ...
01应用启动
IStartupFilter
使用IStartupFilter:
再应用的中间件管道的开头或末尾配置中间件,而无需显式调用Use{Middleware}。使用IStartupFilter在不显式注册默认中间件的情况下将默认值添加到管道的开头。
创建Configure方法的管道。IStartupFilter.Configure可以将中间件设置为在库添加的中间件之前或之后运行。
每个 IStartupFilter 可以在请求管道中添加一个或多个中间件。 筛选器按照添加到服务容器的顺序调用。 筛选器可在将控件传递给下一个筛选器之前或之后添加中间件,从而附加到应用管道的开头或末尾。
下面的示例演示如何使用 IStartupFilter 注册中间件。 RequestSetOptionsMiddleware 中间件从查询字符串参数中设置选项值:
RequestRequestSetOptionsMiddlewareRequestSetOptionsStartupFilter注册StartupFilter1234567891011121314151617181920 ...