You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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接口,让需要事件的实体实现它,再通过扩展方法封装事件操作。但这种方式需要实体自行维护事件集合,封装性不如基类。

不过多数场景下,直接沿用带事件逻辑的基类更省心——就算当前用不上,未来实体需要添加领域事件时,无需修改继承关系,直接调用方法即可,避免后续重构成本。

为什么参考库倾向于统一使用带事件的基类?

主要有这几点原因:

  1. 降低未来重构成本:清洁架构注重领域模型的演进,现在不需要事件的实体,后续很可能会需要。提前嵌入事件逻辑,后续扩展时不用调整实体继承结构,也不用逐个加接口实现。
  2. 统一架构规范:所有实体遵循相同的基础结构,团队成员不用纠结每个实体该继承哪个基类,减少决策内耗,代码风格更统一。
  3. 可忽略的性能开销:示例中的事件集合是空列表初始化,内存占用极小,对系统性能几乎无影响,完全可以接受。
  4. 简化事件发布逻辑:框架层(比如和MediatR集成时)可以统一扫描所有BaseEntity派生类,自动提取并发布领域事件,不用区分哪些实体有事件、哪些没有,降低了框架逻辑的复杂度。

内容的提问来源于stack exchange,提问作者SherleyDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:12:45