整洁架构
实现整洁架构项目分层这个案例分为Users.Domain、Users.Infrastructure、Users.WebAPI这三个项目。 Users.Domain是领域层项目,主要包含实体类、值对象、领域事件数据类、领域服务、仓储接口、防腐层接口等; Users.Infrastructure是基础设施项目,主要包含实体类的配置、上下文类的定义、仓储服务、防腐层接口的实现、基础工具类等; Users.WebAPI是ASP.NET Web...
什么是反射
当然!你问的“什么是反射”,这里给你一个通俗易懂的中文解释: 反射(Reflection)是什么?反射 是 .NET(以及很多语言和平台,比如 Java)提供的一种机制,它能让程序在运行时查看、检查、访问甚至修改自身的类型信息。 简单来说: 反射就是在运行时动态获取或操作对象、类型、方法、属性等元数据的能力。 常用的 System.Reflection 类型 Type表示 .NET 中任何类型的运行时信息,是反射的核心入口。 PropertyInfo表示属性的元数据,能用来读/写属性值。 MethodInfo表示方法的元数据,能用来调用方法。 FieldInfo表示字段的元数据,能用来访问字段值。 ConstructorInfo表示构造函数的元数据,可以用来创建对象。 Assembly表示程序集(.dll 或 .exe),可以用它动态加载程序集并获取类型信息。 MemberInfo表示成员(属性、方法、字段等)的基类,很多 API 返回它。 举个简单的例子假设你有一个类: 1234public class Person{ ...
ASP.NET Core使用RabbitMQ和MassTransit
MassTransit一、MassTransit 基本概念定位:基于 .NET 平台 的开源消息总线框架,用于构建分布式、异步通信的应用程序,支持多种消息传输协议(如 RabbitMQ、Azure Service Bus、Kafka 等)。设计目标:简化分布式系统中消息传递的开发,提供高层次的抽象(如消费者、管道、 Saga 模式等),降低开发者对消息中间件底层细节的依赖。 核心特点多传输协议支持:可无缝集成 RabbitMQ、Azure Service Bus、Kafka、ActiveMQ 等多种消息代理。编程模型友好:基于 C# 语言,支持依赖注入(DI)和 Lambda 表达式,代码简洁易读。内置消费者管道(Consumer Pipeline),支持消息过滤、重试、日志记录等中间件。分布式事务支持:通过 Saga 模式 实现长流程事务的异步协调(如订单状态更新、支付回调处理)。高可用性与监控:支持消费者集群和负载均衡。集成 Prometheus、Grafana 等监控工具,提供运行时指标和健康检查。 应用场景.NET 微服务架构:作为服务间通信的核心组件(尤其适合 C#...
如何安装RabbitMQ服务器
在Windows安装RabbitMQ安装RabbitMQ需要安装Erlang环境,网址:Downloads - Erlang/OTP 下载对应的版本RabbitMQ Erlang Version Requirements — RabbitMQ 配置Erlang环境变量 在搜索框里输入编辑系统环境变量. 变量名一定要写成ERLANG_HOME,变量值就是你的Erlang的安装路径 还需要在系统变量中选中Path进行编辑,新建一个%ERLANG_HOME%\bin 打开命令窗口,输入erl或者erl -version()验证环境是否配置成功(出现以下版本号即成功,显示不是内部命令则环境变量配置失败) 安装RabbitMQ RabbitMQ官网下载址:Installing on Windows — RabbitMQ 配置RabbitMQ环境变量 进入sbin文件下,打开命令窗口输入1rabbitmq-plugins enable...
.NET Core的聚合,MediatR实现领域事件
聚合在.NET中的实现上下文可以从数据库中查询出数据并且跟踪对象状态的改变,然后把对象状态的改变保存到数据库中,因此上下文就是一个天然的仓储的实现;上下文会跟踪多个对象状态的改变,让后在SaveChanges方法中把所有的改变一次性提交到数据库中,这是个“要么全部成功,要么全部失败”的操作,因此上下文也是一个天然的工作单元的实现。 有一些开发人员会再编写仓储和工作单元的接口以封装上下文的操作,这样可以把EF Core的操作封装起来,不仅可以让代码不依赖于EF Core,而且今后如果我们需要把EF Core替换为其他持久化机制,代码切换起来也会更容易。但是本书将直接用上下文作为仓储,而不是定义一个仓储的抽象层,微软也是这样建议的。因为EF Core是一个很好的仓储和工作单元的实现框架,很难找到另一款可以很好实现DDD的ORM框架,无论抽象层怎么定义,如果需要把EF Core替换为其他ORM框架,代码就不可能不做任何改变。我们直接用上下文做仓储,这样可以最大化地利用EF Core的特性,从而提供更高性能的仓储实现。 在EF...
.NET Core的DDD的技术落实
贫血模型与充血模型在面向对象的设计中有贫血模型与充血模型两种风格。所谓的贫血模型指的是一个类中只有属性或者成员变量,没有方法,而充血模型指的是一个类中既有属性、成员变量,也有方法。 假设我们需要定义一个类,这个类中可以保存用户的用户名、密码就、积分;用户必须具有用户名;为了保证安全,密码采用密码的哈希值保存;用户的初始积分为10;每次登录成功奖励5个积分,每次登录失败扣3个积分(这样的需求肯定是不合理的) 贫血模型逻辑代码: 123456class User{ public string UserName{get;set;}//用户名 public string PasswordHash {get;set;}//密码的散列值 public int Credit...
ASP.NET Core程序的发布
网站发布 不能直接把bin/Debug部署到生产环境的服务器上,性能低。应该创建网站的发布版,用【发布】功能。 两种部署模式:“框架依赖”和“独立”。两者的优缺点。 独立模式为什么要选目标操作系统和CUP类型。 如果你使用 Visual Studio,可以通过以下步骤发布: 在解决方案资源管理器中右键点击项目 选择 “发布” 选择发布目标(文件夹、IIS、Azure 等)我们这里选择使用文件夹的方式发布。 配置发布设置(如目标框架、运行时、是否自包含等) 点击 “发布” 按钮 框架依赖部署(FDD)特点 依赖共享运行时:应用程序依赖目标环境中已安装的 .NET 运行时(如 .NET 6/7/8)。 体积小:发布包仅包含应用代码和第三方依赖(如 NuGet 包),不包含 .NET 运行时,因此包体积小。 跨平台兼容性:发布包不包含运行时,需确保目标环境的运行时版本与开发环境兼容。 更新便捷:.NET 运行时由操作系统或管理员统一更新,应用无需包含运行时更新。 适用场景 目标环境已预装 .NET...