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 ...
WPF编程宝典 - 27_3D绘图
WPF 引入了一个扩展的 3D 模型,允许您使用简单标记构建复杂的 3D 场景。辅助类提供了命中测试、基于鼠标的旋转以及其他基本构件。并且几乎所有的计算机都可以显示3D内容这一点要归功于当缺少显卡支持时 WPE退而使用软件涫染的能力。
3D绘图基础
WPF中的3D绘图涉及以下4可要点:
视口,用来驻留3D内容
3D对象
照亮部分或整个3D场景的光源
摄像机,提供在3D场景中进行观察的视点
当然,更复杂的3D场景将包含多个对象并且可能包含多个光源(如果3D对象本身发光的话,也可创建不需要光源的3D对象)。然而,这些基本要素提供了一个良好开端。
那么使用WPF3D支持的优点时什么呢?
可创建一些效果,而如果使用模拟的 3D 模型创建这些效果,就需要非常复杂的计算。一个好的例子是光照效果,如反射,当使用多个光源和具有不同反射属性的不同材质时,反射会变得非常复杂。
作为一组 3D 对象绘制的内容进行交互,这极大地扩展了通过代码能够完成的工作。例如,一旦构建期望的 3D 场景,旋转对象或者绕着对象旋转摄像机就变得很容易了。而如果使用 2D 编程完成相同的工作,就需要大量的代 ...
WPF编程宝典 - 26声音和视频
播放WAV音频
在.NET中播放音频文件的最简单方式是使用不很起眼的 SoundPlayer 类,该类位于同样不很起眼的 System.Media名称空间中。SoundPlayer 类的功能非常有限:只能播放 WAV 音频文件不支持同时播放多个声音,并且没有提供控制音频播放任何方面的能力(例如,音量和平衡等细节)。
如果能够忍受 SoundPlayer 类极大的局限性,那么这仍是为应用程序添加音频功能的最简单、最轻量级的方法。SoundPlayerAction类又对 SoundPlayer 类进行了封装,使用该类可通过声明的触发器播放声音(而不是在事件处理程序中编写几行 C#代码)
SoundPlayer类
为使用SoundPlayer类播放声音,需要执行以下几个步骤:
创建SoundPlayer实例
通过设置SoundLocation或Stream属性来指定声音内容。如果有指向WAV文件的文件路径,就使用SoundLocation属性。如果有基于流的包含WAV音频内容的对象,就使用Stream属性
一旦设置 Stream 或 SoundLocation 属性,就可以通过 ...
WPF编程宝典 - 25菜单、工具栏和功能区
菜单
WPF 提供了两个菜单控件:Menu(用于主菜单)和 ContextMenu(用于关联到其他元素的弹出菜单)。与所有 WPF 类一样,WPF 负责呈现 Menu和 ContextMenu 控件。这意味着这些控件不是简单的 Windows 库封装器,用户可获得更大的灵活性,包括在浏览器中驻留的应用程序中使用它们。
Menu类
WPF 没有假定单独的菜单应放在何处。通常使用DockPanel或Grid 面板的顶行将菜单停靠在窗口顶部,并将它拉伸到整个窗口的宽度。然而,可将菜单放在任何地方,甚至放到其他控件的边缘。甚至,还可在窗口中添加任意数量的菜单。尽管这可能不很合理,但可以堆栈菜单栏或在整个用户界面中分散布置。
Menu 类添加了新属性 IsMainMenu,当该属性为 true 时(这是默认值),按下 Alt 键或 F10键时菜单就会获得焦点,就像其他所有 Windows 应用程序一样。除这个细节外,Menu 容器还可以使用几个熟悉的 ItemsControl 属性。这意味着可使用 ItemsSource、DisplayMemberPath、ItemTemplate ...
WPF编程宝典- 24页面和导航
大多数传统的 Windows应用程序都以包含工具栏和菜单的窗口为中心。工具栏和菜单驱动应用程序–当用户单击它们时,动作发生,并且显示其他窗口。在基于文档的应用程序中,可能还有几个同样重要的立即打开的主窗口,但整个模型是相同的。用户将大部分时间都用在一个地方,并当需要时会跳到另一个单独的窗口。
Windows应用程序非常普遍,以至于有时都很难想象出不同的方式来设计应用程序。然而Web 开发使用非常不同的基于页面的导航模型,并且桌面开发人员发现对于设计特定类型的应用程序这是非常好的选择。在为桌面应用程序开发人员提供构建类似 Web 的桌面应用程序能力的呼声下,WPF提供了自己的基于页面导航的系统。正如您将在本章看到的,它是一个极其灵活的模型。
目前,基于页面的模型最常用于简单的轻量级应用程序(或用于更复杂的基于窗口的应用程序的子部分)。然而,如果希望精简应用程序部署,基于页面的应用程序是比较好的选择。这是因为 WPF 允许创建直接运行于Intemet Explorer 或 Firefox 浏览器中的基于页面的应用程序。这意味着用户不需要执行显式的安装步骤就可以运行应用程序——只 ...