DDD领域驱动设计---战略设计(包括四色原型建模)

      相当于策略设计,从宏观角度着眼于领域的分析设计,属于系统分析阶段,注重如何从有界上下文中寻找领域模型,战略模式由有界上下文、无所不在的语言和上下文映射组成。

     在战略设计前首先要了解下领域知识、业务策略、业务规划。

       1、有界上下文:是指再空间或时间上有边界的一段环境背景,它确定了每个模型的适用范围,模型体现了这个范围内的逻辑一致性。

       2、统一语言:统一语言必须在领域模型中表达出来,主要体现在领域模型中的名称上。不应只由业务专家或是其他单一职位定义,而应团队人员共同商定。

       3、上下文映射组成(上下文关系):

              a、共享内核(例如两个团队共享一份类库)此种方式很少用,耦合度太高。

              b、开发主机服务也就是上下游关系映射或API调用,一个服务通过RPC等同步方式调用另一个上下文的API,这种目前比较普及。

              c、发布\订阅模式:一个发布,一个订阅,只依赖事件或消息,使得两者之间最大化松耦合。   

              d、发布语言(Published Language):两个有界上下文中的模型沟通的语言表达方式。例如XML,JSON

       康威第一定理(Conways Law):组织性质决定架构。即系统架构代表实现系统的组织的沟通结构,对于软件中的每个模块,都对应有一个组织单元;组织单元之间存在沟通依赖,软件中对应的模块之间同样存在依赖关系。

       在领域(独立的产品或是项目)中划分{核心子域(业务策略和业务规则重点实施地),支持(辅助)子域,通用子域。}(具体的项目)每个域确定上下文(领域边界)

       最佳实践:一个有界上下文对应一个子域,对应一个团队,对应一个微服务。

       DDD建模基本上只需要三种UML图:用例图(表达需求用例)、序列图(模拟领域中的逻辑流程,能够记录和验证逻辑)、类图(表达类与结构关系)。

划清领域上下文的方法:

      1、通过领域故事(Domain Storytelling)的方式,专注于领域知识,通过领域语言来探索和理解用户流程、工作程序和整体业务流程和规则。

     例如:问:“你的工作做什么的?”

                答:“进行货运计划调度”

                问:“具体怎么回事?”

                答:“举个例子,客户需要托运一批货物,然后需要让路线小组规划路线,机场小组再分配计划,最后指定机位。”

                这里“客户需要托运一批货物”主语是“客户”,谓语动词“托运”,宾语是“货物”。可以使用不同颜色表示他们:黄色是主语,粉红色表谓语,蓝色表示宾语,具体颜色取决自己,也可参考下面的四色原型。

     2、还有填写表格法和事件风暴会议发现有界上下文。

本环节最主要的就是划清领域上下文。也是整个领域驱动设计的难点。

领域事件:事件代表过去发生完成的事,它既是业务架构概念也是技术架构概念,以事件为驱动的编程技术模型称为事件驱动架构(EDA)。领域事件强调其业务概念。事件即指已经发生的事情,可以从动词完成时理解

命令:命令表示事件的触发器。命令是请求,而事件是完成。命令相当于页面(UI)点击的按钮来触发一个需要完成的任务,这个完成的任务既是指一个事件。

命令命名和事件命名,命令命名相当于动词结尾的ing,事件命名相当于结尾的ed。

关键事件:即指识别状态机状态之间转换的事件,关键事件是领域边界划分的重要指标。

还有事件建模头脑风暴法,这个也是工作中会使用的方法,但是这种方法一定要确定会议各阶段目标,要不效率太低。

例如:首先,确定探索子域。

           2、确定探索有节上下文。

           3、确定用户角色,那些角色发出那些命令,完成那些事件。

           4、确定关键测试场景。


      可参考四色原型建模

      1、moment-interval(某个时刻(moment)或一段很短时间(interval)内. 意味在某个时刻发生的事情因为业务要求或合法性原因需要跟踪;或者过一段时间以后,应该是很短的时间,可以帮助我们寻找到它。)

       卖东西是在某个时刻发生的,它有发生日期和时间。租赁行为是在一段时间内发生,从开始出租和归还所租物品;预定也是持续一段时间,什么时候预定;什么时候过期等。

  这些我们都使用moment-interval原型来表达。Moment-intervals经常封装的是最关键的方法,为让其显目,moment-interval的UML图我们使用粉红颜色表示。如:订单,单据

      2、role(角色原型比较容易理解,任何一个系统都需要人或某个组织介入运行,例如论坛系统需要注册者角色发言;销售订单需要业务员角色制定,等等。)

       这里有一个Party原型定义:它表示一个可标识、可定位的单元,这个单元有自己正常的状态并且能够自主控制自己的一些行为,通常情况下,人或组织是一种Party,但象护照,身份证等注册性标志等都可以作为Party。

       Role角色是Party扮演的(a role that a Party plays),Party是角色Role的扮演者(role-player)。角色原型在UML中是使用黄颜色标识的。角色模型是第二重要的原型,所以使用黄色。如:订单的配送类型,用户的类别角色。

      3、description archetype

       比如你的红色福克斯是福特生产的一辆轿车,它有车牌号、购买日期、颜色和里程表等,这些代表Thing原型,那么作为轿车这个种类来说,它有一些种类属性,例如:生产厂家、生产批号、适用颜色等,这些属性是轿车这类所有车辆都共有的。

        在设计模式这个实现级别,我们通常使用组合模式来实现种类原型。Description原型在UML中使用蓝色表达。比如:客户实体的地址描述,这部分信息是可以通用的。

      4、party, place or thing

         party place或thing都可以成为角色原型,注意到角色原型中的UML图,party图是以绿色表达。比如:客户、商品。

电商DDD四色图示例

    

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

任玉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值