核心域、支撑子域、通用子域
(1)边界 限界上下文是一个显示的边界,领域模型边存在于这个边界之内。 在边界内,每一个概念模型,包括其属性和操作,都具有特定的含义。
(2)概念命名 在一个上下文中,团队通常根据通用语言来命名某个概念。
比如两个银行上下文,一个用于支票账户,一个用于储蓄账户。在支票上下文中,我们不必使用 checking account ,也不必在储蓄上下文中使用 saving account ,两个概念都可以使用账户 account 来表示。
在领域中还同时存在着问题空间和解决方案空间
问题空间是由战略核心域及其支撑子域组成
两种表示方式:
通过SOA的方式来聚合数据
使用管道和过滤器模式实现
将管道和过滤器分布化和并行化,这需要加入长时处理过程,有时也加入Sagas.
跟踪对系统的每一次改变,采用事件源(Event Sourcing)
分层架构模式被认为是所有架构的始祖。
在分层架构中,我们将领域模型和业务逻辑分离出来,并减少对基础设施、用户界面甚至是应用层逻辑的依赖,因为他们属于不同的业务逻辑。将一个复杂的系统分为不同的层,每层都应该具有良好的内聚性,并且只依赖于比其自身更低的层。
分层架构的一个重要的原则是:每层只能与位于其下方的层发生耦合
分层架构分类:
用户界面只用于处理用户显示
和用户请求
,可对用户输入进行校验
,不应该包含领域或业务逻辑。
如果用户界面使用了领域模型中的对象,那么此时的领域对象仅限于数据的渲染展现。在采用这种方式时,可以使用展现模型(Presentation Model)
,对用户界面和领域模型进行解耦。
由于用户可能是人,也可能是其他的系统,因此有时用户界面层将采用开放主机服务
的方式向外提供API
应用服务(Application Service)位于应用层中。
应用服务和领域服务(DomainService)是不同的,因此领域逻辑不应该出现在应用服务中。
应用服务可以用于持久化事务
和安全认证
,或者向其他系统发送基于事件的消息通知
,另外还可以用于创建邮件
以发送给用户。
应用服务本身并不处理业务逻辑,但它却是领域模型的直接客户。
应用服务是很轻量的,它主要用于协调对领域对象的操作,比如聚合
聚合的最佳实践
:
当需要创建新的聚合时,应用服务应该使用工厂或聚合的构造函数来实例化对象,然后采用资源库对其持久化。应用服务还可以调用领域服务来完成和领域相关的任务操作,但此时的操作应该是无状态的。
存储和转发事件:p106
资源库接口实现放在应用层中: 在分层架构中,领域层或多或少地需要使用基础设施层。这里我并不是说核心的领域对象会直接参与其中,而是说领域层中的有些接口实现依赖于基础设施层。比如资源库接口的实现需要基础设施层提供的持久化机制。
还有更好的方法,参见下文的依赖倒置原则。