工厂方法设计模式&反射
工厂方法设计模式 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化,延迟到子类。 我们做一个“加减乘除计算器”来理解工厂方法设计模式。 设计结构 抽象产品:ICalculator具体产品:Add/Sub/Mul/Div通用反射工厂:CalculatorFactory 定义运算接口(抽象产品) 12345public interface ICalculator{ double Calculate(double a, double b);} 具体运算类(具体产品) 12345678910111213141516171819202122232425262728293031323334353637[Operation("add")]public class Add : ICalculator{ public double Calculate(double a, double b) { return a + b; ...
单例模式
一、饿汉式(Eager Initialization) 类加载时就创建实例 实现方式 1234567891011public sealed class Singleton{ // 类加载时就创建实例 private static readonly Singleton _instance = new Singleton(); // 私有构造函数,防止外部创建 private Singleton() { } // 全局访问点 public static Singleton Instance => _instance;} 优点 天生线程安全(CLR 保证静态初始化线程安全)实现简单没有锁开销 缺点 即使不使用,也会创建实例可能浪费资源适用场景单例对象占用资源小必然会被使用 不在意提前初始化 懒汉式(Lazy Initialization)第一次使用时才创建实例 非线程安全版本(不推荐) 123456789101112131415161718public sealed class...
编程思想3.1
单一职责原则(Single Responsibility Principle, SRP)什么是单一职责原则 一个类只负责一件事情一个模块的所有功能都应该高度相关、围绕同一职责当需求变更时,应只影响到一个类,而不是同时影响多个不相关功能的类 为什么要遵守SRP 降低耦合 当一个类承担多种职责时,一个职责的变化可能会影响到其他职责。 提高可维护性 变更影响面更小,维护更轻松。 提高可测试性 单一职责的类更容易编写单元测试。 增强可读性 结构更清晰,让别人一眼就知道这个类的目的。 示例 12345678910111213141516171819202122public class TelPhone{ public void Dial(string phoneNumber) { Console.WriteLine("给 " + phoneNumber+" 打电话"); } public void HangUp(string phoneNumber) ...
编程思想2.1
高内聚 高内聚:模块内部元素具有相同特点的相似程度。高内聚提供了更好的程序可靠性、可读性。 模块: 什么是模块呢? 小到一个方法、一个接口、一个类,大到一个业务,一个功能。 模块的四要素: 接口:模块的输入和输出。功能:模块实现了什么功能。逻辑:模块内部如何实现要求的功能,以及所需要的数据。状态:指模块调用与被调用的关系。 而高内聚就是指模块内的相似程度 举例: 模块中有:Class:新闻管理 Method:新闻查看、新闻更新、新闻删除Class:用户管理 Method:设置用户名、设置密码、用户注册、用户删除 这两个例子就是高内聚,新闻类中提供的方法、元素都跟新闻有关,这就是具有相同特点的相似程度符合高内聚的标准。 低内聚: Class:新闻管理 Method:新闻查看、新闻更新、新闻删除,用户注册 低内聚会给我们带来什么问题? 低耦合:能不引用绝不引用,宁可间接引用牵一发而动全身 低耦合 指的是模块之间的依赖程度。低耦合提供了更好的程序可扩展性和可复用性。 举例: 主板&显卡显卡不依赖于某一款主板 低耦合显卡必须依赖莫一款主板 ...
编程思想1.1
...
搭建认证服务
认证服务用来验证用户登录并颁发JWT,也提供用户管理等API。认证服务的实现代码都基于Authentication与Authorization。 开发认证服务的领域层IdentityService.Domain是认证服务的领域层项目。ASP.NET Core的标识框架中已经提供了IdentityRole、IdentityUser等基础的实体类,我们只要编写它们的子类,然后根据需要再添加自定义的属性即可。 首先创建Role和User类进行编写 1234567891011121314151617namespace IdentityService.Domain.Entities{ /// <summary> /// 表示系统中的角色实体,继承自 ASP.NET Core Identity 的 IdentityRole,主键类型为 Guid。 /// </summary> public class Role : IdentityRole<Guid> { ///...
搭建文件服务
文件服务用来将用户上传的音频文件上传到文件服务器和备份服务器。为了提高处理速度和避免文件重复上传,当用户上传服务器中已经存在的文件时,文件服务器会直接把之前的文件返回给上传者。 开发文件服务的领域层FileService.Domain是文件服务的领域层项目。文件服务中只有一个领域模型“上传项”(UploadedItem),每一次用户上传的文件就是一个“上传项”。UploadedItem实体类中定义了如下几个主要的属性。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960/// <summary>/// 表示已上传的文件项,包含文件的基本信息和备份、远程访问地址。/// </summary>public record Uploadedltem : BaseEntity, IHasCreationTime{ /// <summary> ///...
主系表
主系表主谓宾(特殊)=主系表Look=看起来This girl looks pretty.这个女孩看起来很漂亮。Smell=闻起来This flower smells good.这朵花闻起来很不错。Taste=尝起来This candy tastes sweet. 主语 (Subject):句子描述的核心对象(人、事、物、抽象概念等)。 示例:He, The book, Her smile, This city 系动词 (Linking Verb):连接主语和表语的动词,本身无实际动作含义,仅起 “连接” 和 “表述状态” 的作用。 核心系动词:be 动词(am, is, are, was, were) 其他常见系动词: 表 “变化”:become(变得)、get(变得)、turn(变成)表 “感官”:look(看起来)、sound(听起来)、taste(尝起来)、smell(闻起来)、feel(摸起来 / 感觉)表 “保持”:keep(保持)、stay(维持)、remain(仍然是)表语 (Predicate...
及物动词和不及物动词
及物动词和不及物动词及物动词:触及物体(宾语·)及物动词必须要接宾语!1.eat 吃 I eat a pear.我吃一个梨子。2.watch 观看 I watch TV. 我看电视。3.see看到 He sees a monkey. 他看到一只猴子。 不及物动词:不触及物体(宾语·),介词(当桥梁)1. look 看 I look at a person. 我看着一个人。2. run 跑 I run on the ground. 我在地上跑。3. sleep 睡觉 Marry sleeps in her bedroom. Marry在卧室睡觉。不及物动词可不接任何成分,单独成句4. die 死亡 He died. 他死了5. win/lose 胜利/失败 You win/lose. 你赢/输了6. arrive/come/go He has arrived/come/gone 他到了/来了/走了。
注册MediatR,添加工作单元过滤器
注册MediatR12// 注册 MediatR,用于领域事件和命令处理services.AddMediatR(assemblies); 把指定程序集(assemblies)里实现的 MediatR 处理程序注册到依赖注入容器,这样你就可以用 MediatR 的领域事件和命令模式了。AddMediatR是自定义扩展方法。 12345678910111213141516171819202122232425262728293031323334353637383940414243public static class MediatorExtensions{ /// <summary> /// 扩展IServiceCollection以批量注册MediatR相关服务。 /// </summary> /// <param name="services">依赖注入服务集合。</param> /// <param...



