11 2022 档案
摘要:一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层,则后台代码也要
阅读全文
摘要:当绑定目标和绑定源的数据类型不一致,且无法进行隐式转换时,可以通过转换器Converter进行数据类型的转换。转换器是一个实现IValueConverter接口的类,实现Convert和ConvertBack两个方法,其中Convert方法,传入绑定源数据,返回转换后的数据给绑定目标;ConverB
阅读全文
摘要:本节内容,部分为补充内容,部分涉及到9.3.10-9.3.12(P335-342)。主要NuGet包: RabbitMQ.Client 微服务间,跨进程的事件发布和订阅,需要借助第三方服务器作为事件总线,目前常用的有Redis、RabbitMQ、Kafka等,本章节介绍RabbitMQ。 一、基本过
阅读全文
摘要:本章节内容较多,目录如下: 基本概念 数据绑定的五种实现方式 绑定路径Path 绑定模式BindingMode 绑定数据源的字符串格式化StringFormat 绑定源设置为自身或上级RelativeSource 绑定源不存在链接属性的回退值或链接属性值为Null时的替换值 编译绑定 一、基本概念
阅读全文
摘要:本节内容,部分为补充内容,部分涉及到9.3.8-9.3.9(P327-334)。主要NuGet包: MediatR.Extensions.Microsoft.DependencyInjection 领域事件可以切断领域模型之间的强依赖关系,但如果使用传递的事件机制,要求将事件的处理者显式的注册到事件
阅读全文
摘要:本节内容,部分为补充内容,部分涉及到9.3(P321-326)。主要NuGet包:无 一、使用值对象的两种情形及其EFCore映射配置 1、没有标识符的从属实体类 如商店的地理位置,包含经度和纬度,可以定义一个包含Longitude(经度)和Latitude(纬度)两个属性的Geo类型。 如商品的质
阅读全文
摘要:本节内容,部分为补充内容,部分涉及到99.3(P311-320)。主要NuGet包:无 领域建模有两种方式,一是贫血模式,二是充血模型。EFCore对充血模型,已经有了非常好的支持,我们应该通过充血模型的方式来设计实体,将有关个体的业务逻辑封装在实体内。 一、贫血模型:又叫POCO类,类中只有属性或
阅读全文
摘要:本节内容,部分为补充内容,部分涉及到9.1-9.2(P299-311,326-327)。主要NuGet包:无 一、DDD领域驱动设计 1、DDD是一种设计思想,领域即业务,业务驱动设计,直接将业务映射到代码中。 2、DDD的设计始于领域的划分,一个项目可以划分为多个子域,并可以按功能划分为核心域、非
阅读全文
摘要:PS1:点击查看Blazor中C#和JS互操作 PS2:Vue中,可以直接使用LocalStorage和IndexedDB对象,本章节案例主要以Blazor的使用为主 一、Storage对象 1、浏览器内置的键值对存储。locallStorage理论上永久保存在浏览器中(除非主动清除),而Sessi
阅读全文
摘要:一、什么是Markup语法 XAML可以使用等效的C#后台代码,即可以用C#写UI。但是,C#代码还稍显繁琐,所以在C#代码基础上,由CommutityToolkit提供了Markup扩展包,可以使用更加流畅的C#语法来写UI。通过如下案例来对比一下三者差异: <!--XAML--> <Conten
阅读全文
摘要:MAUI支持跨平台和多设备,可以针对不同平台(Android、iOS、WinUI、MacCatalyst、Tizen),或不同设备(Phone、Tablet、Desktop、TV、Watch),定制不同的UI,应用根据运行环境,自动适应。主要通过OnPlatform和OnIdiom两个标记扩展实现。
阅读全文
摘要:一、样式的定义和使用 Style类似于前端的CSS,可以对视觉元素的样式进行有组织的管理,大量减少代码和重复工作量。Style需要结合资源字典使用,将Style定义在资源字典中,元素通过StaticResource或DynamicResource引用样式资源。 二、引用样式资源的匹配原则 1、元素使
阅读全文
摘要:每个派生自VisualElement或Application的对象,都有一个Resources属性,属性值为Dictionary<string,object>类型的集合对象,这些集合对象可作为资源,提供给元素及其在控件树中的子元素使用。当元素引用资源时,根据键名延着控件树往上匹配。如果控件树中,有多
阅读全文
摘要:本节内容,为补充内容,部分类型涉及5.1和5.2,P129-P134。主要NuGet包: 一、实体更改跟踪 EFCore默认采用“快照更改跟踪”,会对“通过DbContext上下文查询出来的所有实体对象”进行跟踪,首次跟踪时,EFCore会为每个实体创建快照。通过对比当前值和快照值,就可以确定实体的
阅读全文
摘要:本节内容,部分为补充内容,部分涉及到5.2(P131-133)。主要NuGet包:如前章节所述 仓储模式,将数据访问层抽象出来,隐藏了底层对数据源的CRUD操作,这样在应用层或控制器中,我们直接访问仓储封装的方法即可,不需和数据源直接接触。泛型仓储以面向接口和泛型方式实现,一方面,可以非常方便的更换
阅读全文
摘要:x命名空间,又叫XAML命名空间,作用于XAML的编译过程。我们知道,XAML代码,最终通过XAML编译器,编译为中间代码IL,并与后台C#代码的编译结果合并。而在编译的过程中,经常需要告诉编译器一些重要信息,比如应该与哪个C#类的编译结果合并、XAML声明的元素是public还是private、元
阅读全文
摘要:标记扩展,本质上是IMarkupExtension或者IMarkupExtension<T>接口的实现类。这两个接口,均定义了ProvideValue方法。注意,IMarkupExtension<T>继承自IMarkupExtension,如果定义的标记扩展类,需要实现IMarkupExtensio
阅读全文
摘要:标记扩展,使属性值可以引用其他源的值或对象,比如引用资源字典、引用其它控件的属性值、绑定ViewModel类属性等。标记扩展的语法有大括号{}和尖括号<>两种方式,但x:Array比较特殊,只能使用尖括号。下个章节,深入学习标记扩展后,将能够理解两者区别。为方便学习和记忆,将标记扩展归纳为以下几类:
阅读全文
摘要:一、XAML(MAUI的XAML)和HTML 两者相似,都是标签语言组成的树形文档。每个标签元素,可视为一个对象,通过标签属性(Attribute),为对象的属性(Property)、事件等成员赋值。此处特别将Attribute和Proterty提出来,两者中文都叫属性,但Attribute对应于U
阅读全文
摘要:MAUI是微软.NET技术栈的跨端UI框架,2022年11月,和.NET7一起正式发布,未来能否和flutter一战? MAUI使用XAML标记语言进行开发,相对HTML而言,更加复杂和繁琐,但功能更加全面严谨。MAUI内部,通过Handler机制(面向接口编程),将MAUI的控件映射到各平台的Na
阅读全文
摘要:本节内容,部分为补充内容。主要NuGet包: Microsoft.AspNetCore.SignalR.Client(BlazorWASM的SignalR客户端) Microsoft.AspNetCore.SignalR.StackExchangeRedis(使用Redis部署分布式SignalR)
阅读全文
摘要:本系列是杨中科2022年最新作品《ASP.NET Core技术内幕与项目实战》及B站配套视频(强插点赞)的精简集,是一个读书笔记。总结和提炼了主要知识点,遵守代码优先原则,以利于快速复习和查询。所以,建议和我一样,先阅读书籍或看B站视频,然后再通过本系列快速的复习知识点。 本系列覆盖了书本中的大多数
阅读全文
摘要:本节内容,部分为补充内容。主要NuGet包: Dapper(Dapper操作数据库) System.Data.SqlClient(连接数据库) Microsoft.EntityFrameworkCore.SqlServer(ORM的SqlServer数据库提供者) Microsoft.EntityF
阅读全文
摘要:本节内容,涉及到8.3(P269-P272),以WebApi说明为主。主要NuGet包: 内置命名空间:System.ComponentModel.DataAnnotations FluentValidation.AspNetCore(数据检验框架) 一、请求数据检验的作用 1、客户端和服务端进行数
阅读全文
摘要:本节内容,涉及到8.2(P265-P269),以WebApi说明为主。主要NuGet包: 一、一个简单的托管服务 //创建托管服务类 //TestBgService public class TestBgService : BackgroundService { private readonly I
阅读全文
摘要:本节内容,涉及到7.4(P198-P221),以WebApi说明为主。主要NuGet包: Microsoft.Extensions.Caching.StackExchangeRedis(Redis缓存) 一、图解缓存机制 1、如图所示,首次请求数据时,先从缓存中获取,如果没有,则继续向数据库中获取。
阅读全文