编程思想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...
名词性从句
名词性从句主语从句+宾语从句 主语、宾语==名词介词短语(介宾)=介词+名词1,I look at you.我看着你。You是名词,可以改成我所喜欢的东西。I look at what I like thing.2.我进入这栋房子。I get into the house.我进入他所住的地方。I get into where he lives.3.我对这本书很感兴趣。I am very interested in this book.我对他啥时候来我家很感兴趣。I am very interested in when he will come to my home.4.我对这个问题很困惑。I am confused with the question.我对他这么做的原因很困惑。I am confused with why he did this.5.我不知道这件事。I have no idea of this.我不知道他是否会来。I have no idea of whether he will come.我不知道她是怎么解出这道问题的。I...
配置 JWT 认证 和 Swagger 的认证支持
配置认证与授权12345// 添加认证服务builder.Services.AddAuthentication();// 添加授权服务builder.Services.AddAuthorization(); AddAuthentication():注册认证系统,用JWT认证。AddAuthorization():注册授权系统,用于在 [Authorize] 等特性中判断用户是否有权限访问。 读取并绑定 JWT 配置,注册 JWT 认证方案12// 从配置中获取 JWT 相关配置JWTOptions jwtOpt = configuration.GetSection("JWT").Get<JWTOptions>(); 从配置源读取JWT节点,并绑定到 JWTOptions 对象里。 12345678910111213141516171819202122public class JWTOptions{ /// <summary> /// 令牌颁发者(Issuer)。 /// </summary> ...



