以传统应用示例明确领域驱动设计的用法

阅读数:1015 2015 年 3 月 26 日

话题:语言 & 开发架构

领域驱动设计(DDD)是一种软件构建方法,它强调多角色之间的协作,包括领域专家、开发人员和为满足业务目标而涉及到的其他角色,Naresh Bhatia 以 Bullsfirst 为例解释了 DDD 基础概念的引进,这个例子取自财务传统领域中一个具有中等复杂度的系统,他希望这个例子能够易于大家的理解。

Bhatia 参与了这个示例,他是一名软件架构师和和 Archfirst的创始人,他学习 DDD 基础时提取出了他认为最重要的概念。

一门统一的语言是大家对领域形成共识的关键。在领域专家和开发人员交流时,使用公共术语可以尽可能地降低误解的风险,避免开发人员以编码术语来描述一个领域。

边界上下文是一种将大领域划小的方式,以业务视角把不同的关注点分隔到它们所属的上下文中。Bhatia 说,一个模型应该足够的小,小到可以由一个团队来负责。

领域模型中除了这些最常见的概念(比如实体和价值对象)之外,Bhatia 还总结了一些他觉得很重要的其他概念。

  • 一项与领域概念相关的领域服务,通常一些业务逻辑运行于一组对象之上,因此并非单一实体的自然构成部分。通常领域服务是无状态的。Bhatia 的示例中有个MatchingEngine的例子,包含的业务逻辑是匹配订单并执行交易。
  • 领域事件代表领域内会发生的一些重要的事情,只共享这些事件可以解除组件间的耦合。
  • 聚合用来把相关的对象归为一组,一起充当一个单元。一个对象作为根,它是聚合成员唯一对外的用户,外界只能调用它的方法,这样就有效地隐藏了所有其他对象。早些时候 Vaughn Vernon 就已经详细阐述过聚合了。

Bullsfirst 是 Bhatia 用作示例的系统,它是一个包含有 RESTful API(遵循REST Maturity Level 2)使证券交易更简单的开源项目,是一个负责订单匹配和执行的交易所,是一个负责创建订单的订单管理系统。采用的技术包括有 Java、.NET、FIX、messaging 和 Web Services。相关代码可点此下载

查看英文原文Clarifying Domain-Driven Design Using a Trading Application Example