.NET清洁架构中Base Entity类的实现及领域事件设计疑问
.NET清洁架构中领域事件基类的设计疑问
我正在学习.NET平台下的清洁架构,发现近期几乎所有示例都将领域事件逻辑嵌入Base Entity基类中,示例代码如下:
using System.ComponentModel.DataAnnotations.Schema; namespace CleanArchitecture.Domain.Common; public abstract class BaseEntity { // This can easily be modified to be BaseEntity<T> and public T Id to support different key types. // Using non-generic integer types for simplicity public int Id { get; set; } private readonly List<BaseEvent> _domainEvents = new(); [NotMapped] public IReadOnlyCollection<BaseEvent> DomainEvents => _domainEvents.AsReadOnly(); public void AddDomainEvent(BaseEvent domainEvent) { _domainEvents.Add(domainEvent); } public void RemoveDomainEvent(BaseEvent domainEvent) { _domainEvents.Remove(domainEvent); } public void ClearDomainEvents() { _domainEvents.Clear(); } }
所有实体均继承此类基类,但部分实体并不需要领域事件。请问是否应创建不同的基类或接口来适配该场景?为何这些参考库更倾向于让所有实体继承包含事件逻辑的基类?
是否需要创建不同基类或接口?
可以,但不是必须,具体看项目规模和未来需求:
- 若项目中无需领域事件的实体占比极高,且你对内存开销有极致要求(实际上这部分逻辑的内存影响微乎其微),可以拆分基类:
BaseEntity:仅包含Id等核心基础属性EventDrivenBaseEntity:继承BaseEntity,额外封装领域事件相关方法和集合
- 也可以用接口方案:定义
IHasDomainEvents接口,让需要事件的实体实现它,再通过扩展方法封装事件操作。但这种方式需要实体自行维护事件集合,封装性不如基类。
不过多数场景下,直接沿用带事件逻辑的基类更省心——就算当前用不上,未来实体需要添加领域事件时,无需修改继承关系,直接调用方法即可,避免后续重构成本。
为什么参考库倾向于统一使用带事件的基类?
主要有这几点原因:
- 降低未来重构成本:清洁架构注重领域模型的演进,现在不需要事件的实体,后续很可能会需要。提前嵌入事件逻辑,后续扩展时不用调整实体继承结构,也不用逐个加接口实现。
- 统一架构规范:所有实体遵循相同的基础结构,团队成员不用纠结每个实体该继承哪个基类,减少决策内耗,代码风格更统一。
- 可忽略的性能开销:示例中的事件集合是空列表初始化,内存占用极小,对系统性能几乎无影响,完全可以接受。
- 简化事件发布逻辑:框架层(比如和MediatR集成时)可以统一扫描所有
BaseEntity派生类,自动提取并发布领域事件,不用区分哪些实体有事件、哪些没有,降低了框架逻辑的复杂度。
内容的提问来源于stack exchange,提问作者SherleyDev
相关产品推荐
相关产品推荐

