领域驱动设计(DDD)理论与方法

  • Domain为领域层(或模型层),负责表达业务概念,业务状态信息以及业务规则。尽管保存业务状态的技术细节是由基础设施层实现的,但是反映业务情况的状态是由本层控制并且使用的。领域层是业务软件的核心,领域模型位于这一层。

  • Infrastructure层为基础设施层,向其他层提供通用的技术能力:为应用层传递消息,为领域层提供持久化机制,为用户界面层绘制屏幕组件等,其中消息包含了消息中间件所发的消息、基本的电子邮件(SMTP)或者文本消息(SMS)等

领域驱动设计(DDD)理论与方法

但是分层架构也不是没有缺点,除了引入分层导致层之间交互带来的性能开销之外,也存在一些开发上的问题,比如:

1)容易导致分层划分不当,比如领域逻辑大量渗透到应用服务层,导致领域模型变成贫血模型,尽管有些最佳实践和其他解决方案能够解决上述问题,但也增大了新方案带来的学习成本

2)容易违反分层架构原则,比如在DDD设计中,如果领域层使用了基础设施层的实体对象持久化机制,那么基础设施层将反向引用领域层的业务对象,违反了分层架构原则。即使领域层使用基础设施层的持久化库接口Repository,领域模型仍然存在外部依赖,无法保证业务逻辑的顺利执行,也给测试开发带来了困难,理想中的领域模型应该是纯业务、基于内存运行的业务逻辑封装。

对第一个问题,可以通过DCI来解决,详见下文#DDD与DCI部分。对第二个问题可以通过依赖倒置原则(Dependency Inversion Principle,DIP)来解决,详见下文#DDD与六边形架构部分

DDD与DCI

=======

面向对象建模面临的一个棘手问题是数据边界和行为边界往往不一致。遵循模块化的思想,我们通过类将行为和其紧密耦合的数据封装在一起。但是在复杂的业务场景下,行为往往跨越多个领域对象,这样的行为如果放在某一个对象中必然会导致别的对象需要向该对象暴漏其内部状态。所以面向对象发展的后来,领域建模出现两种派别之争,一种倾向于将跨越多个领域对象的行为建模在领域服务中。如果这种做法使用过度,则会导致领域对象变成只提供一堆get方法的哑对象,这种建模结果被称之为贫血模型。而另一派则坚定地认为方法应该属于领域对象,所以所有的业务行为仍然被放在领域对象中,这样导致领域对象随着支持的业务场景变多而变成上帝类,而且类内部方法的抽象层次很难一致。另外由于行为边界很难恰当,导致对象之间数据访问关系也比较复杂,这种建模结果被称之为充血模型。

比如以字处理器中拼音检查为例,拼音检查这个行为功能放在哪里?是dictionary 还是一个全局的拼音检查器呢?无论放在哪个对象内部,都显得和这个对象内聚性不高,由此带来多个调用拼音检查行为对象之间的协作耦合,在DDD 中,可以使用领服务来实现;在SOA看来,拼音检查属于一种规则,可由规则引擎实现,通过服务整合流程和规则。

再比如银行转账,如果将转账的业务逻辑这个程序算法整合到账户Account数据模型中,因为转账涉及到其他账户和Money数据对象,那么就将因为行为操作带来的耦合带到当前账户对象中了;当然,如果程序算法可以精化细分,那么我们把它切分到几个部分,封装成几个对象的方法,但是这些方法都是无法表达算法逻辑高内聚性的琐碎小方法。

DCI架构则不同于DDD 这种有些折扣的处理方法,而是思路复位,重新考虑架构。DCI架构是James O. Coplien和Trygve Reenskaug在2009年发表的论文《Architecture: A New Vision of Object-Oriented Programming》(以下简称DCI Architecture)中引入,从OO 思想根源来深入解剖DCI 对传统面向对象的颠覆。DCI从对象数据object Data, 对象之间的协作the Collaborations between objects, 和表达需求用例中操作者角色之间的交互这三个出发点来考虑,认为数据模型data model, 角色模型role model和协作交互模型collaboration model(算法属于协作交互模型) 应该是程序语言核心关心点,应该从语言层面来关注,DCI各部分组成及含义如下:

  • Data:描述系统有哪些领域概念及其之间的关系,该层专注于领域对象的确立和这些对象的生命周期管理及关系,让程序员站在对象的角度思考系统

  • Context:Context通过无状态绑定role来完成业务逻辑࿰

  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,旨在解决复杂业务领的软件开发问题。它强调将业务领的知识和概念直接融入到软件设计和开发中,以实现更好的业务价值和可维护性。 在C#中实施DDD时,可以采用以下几个关键概念和技术: 1. 领模型(Domain Model):领模型是DDD的核心概念,它是对业务领的抽象和建模。在C#中,可以使用类和对象来表示领模型,通过定义实体(Entity)、值对象(Value Object)、聚合根(Aggregate Root)等概念来描述业务领中的实体和关系。 2. 领域驱动设计的分层架构:DDD通常采用分层架构来组织代码。常见的分层包括用户界面层(UI)、应用服务层(Application Service)、领层(Domain Layer)、基础设施层(Infrastructure Layer)等。每一层都有不同的职责和关注点,通过良好的分层设计可以实现代码的可维护性和可测试性。 3. 聚合根和聚合:聚合根是DDD中的一个重要概念,它是一组相关对象的根实体,通过聚合根可以保证一致性和边界。在C#中,可以使用类来表示聚合根,通过定义聚合根的行为和关联关系来实现业务逻辑。 4. 领事件(Domain Event):领事件是DDD中用于描述领中发生的重要事情的概念。在C#中,可以使用事件(Event)或委托(Delegate)来表示领事件,并通过事件驱动的方式来处理领事件。 5. 仓储(Repository):仓储是用于持久化和检索领对象的接口或类。在C#中,可以使用接口和实现类来定义仓储,并通过依赖注入等方式将仓储注入到其他类中。 6. 领服务(Domain Service):领服务是一种用于处理领逻辑的服务。在C#中,可以使用类和方法来表示领服务,并将其注入到其他类中使用。 以上是DDD领域驱动设计在C#中的一些关键概念和技术。通过合理运用这些概念和技术,可以更好地实现复杂业务领的软件开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值