让我重新审视我的架构的面试题:Understanding Domain‑Driven Design

发布: (2025年12月21日 GMT+8 12:20)
6 分钟阅读
原文: Dev.to

Source: Dev.to

抱歉,我无法直接访问外部链接来获取文章内容。请您将需要翻译的文本粘贴在这里,我会按照您的要求将其翻译成简体中文,并保留原始的格式、Markdown 语法以及技术术语。谢谢!

面试问题

你能解释一下你在过去的项目中是如何使用领域驱动设计(Domain‑Driven Design)的?

那一个简单的问题让我瞬间僵住了。

那是我的第二轮面试——也是该职位的最后一轮。第一轮结束后,面试官提到需要进行一次技术测试。因此,当我收到第二轮面试的邀请时,我几乎花了一周时间准备——主要集中在 .NET Core 中的 LINQ 和 Entity Framework 上。

我的编程之路始于 Visual Basic 6,随后转向 VB.NET,后来又转向 C# 和 Python。在使用 C# 的这些年里,我主要使用 ADO.NET,编写原始的 SQL 查询和存储过程。这也是我对这些新方法不熟悉的原因——我知道这是我必须弥补的弱点。

我花了一周时间赶进度。得益于之前的经验,只用了几天就把整体框架弄清楚,剩下的时间则用于打磨和准备测试。

我对DDD的理解

在面试中,我这样解释我的架构:

  • 仓储通过 Entity Framework 与数据库通信
  • 服务使用这些仓储来处理业务逻辑
  • 控制器充当端点,与前端或移动应用交换数据

我说完后,面试官笑着说:

“Tim,你真的很聪明。”

面试结束后,我问 AI 这种架构风格叫什么。答案是:领域驱动设计。那一刻让我感到惊讶——我一直在应用 DDD 的一些部分,却甚至没有意识到。

我事后意识到的

起初,我以为 DDD 只不过是额外的层次:实体、仓储、服务……就像一个整齐的文件夹结构。但后来我意识到,DDD 并不是关于结构——而是关于意义。它关注的是结构如何体现真实的业务领域。

核心概念是 通用语言——代码要映射业务实际的说法。

不要这样想:

“这个函数更新了一张表。”

DDD 让你这样想:

“这个函数完成一个订单。”

这个差别听起来很小,却彻底改变了你设计、阅读和讨论代码的方式。面试官并不是在考察我对框架的了解——而是在检验我是否能把技术实现与业务意图相连接。这正是领域驱动设计的全部意义。

What DDD Really Means (in Simple Terms)

  • Domain – 你正在建模的真实世界问题空间(订单、支付、客户……)。
  • Ubiquitous Language – 开发者与领域专家之间共享的语言。
  • Entities – 具有身份和生命周期的对象(如 OrderCustomer)。
  • Value Objects – 定义特征但没有身份的对象(如 MoneyAddress)。
  • Aggregates – 作为一个整体一起变化的实体组。
  • Repositories – 抽象的持久化层,使你能够保存或加载聚合,而不泄露数据库逻辑。

应用该洞见

在那次面试之前,我的 OrderService 看起来是这样的:

public void CompleteOrder(int orderId)
{
    var order = _repository.GetById(orderId);
    order.Status = "Completed";
    _repository.Update(order);
}

它能工作——但主要是数据驱动的。了解了领域视角后,我把它重写为表达意图,而不是 CRUD 操作:

public void CompleteOrder(Order order)
{
    order.MarkAsCompleted();
    _repository.Save(order);
}

现在,重点在于业务在做什么——而不是数据库如何变化。这个小小的转变让我的架构感觉更清晰、更易读,也更有意义。

关键要点

  • DDD 并不是关于花哨的模式或层次结构——它是关于在代码中表示业务领域。
  • 即使你没有完整地应用 DDD,以领域术语思考也能让代码更清晰、更易维护。
  • 最佳的架构不仅能运行——还能传达意图。

Closing Thoughts

那次面试让我学到了一件意想不到的事——有时,你已经理解了良好的架构原则,只是还没有学到它们的名称而已。理解是分层的——就像良好的架构一样。

Back to Blog

相关文章

阅读更多 »

SOLID 再探 — 后模式视角

为什么原则不如背后的力量重要:SOLID 不是一份检查清单,而是对更深层力量的历史压缩。这是系列的第 5 部分。

我为什么构建 ElysianDB

早期后端决策的问题 大多数项目并不是因为缺乏创意而失败。它们放慢速度是出于更结构性的原因:后端决策…