写点什么

面向 XML 的领域建模设计

  • 2007-10-30
  • 本文字数:2171 字

    阅读完需:约 7 分钟

在领域驱动设计(DDD:Domain Driven Design)中,实现业务逻辑层主要有三种模式 [1]:Transaction Script、Domain Module 和 Table Module。随着业务逻辑复杂程度的增加,采用各模式实现的工作量变化趋势有所不同;根据应用特点,三种模式也各有优势:

  1. Transaction Script:业务逻辑直接用 SQL 脚本与数据库交互,实现简单,但是限于 SQL 面向过程化的特点,完成复杂业务逻辑时工作量较大。
  2. Domain Module:将业务数据封装为业务对象,适于业务逻辑复杂的应用,但需要 O/R 映射的支持。
  3. Table Module:将业务数据组织成数据表方式,虽然对象化特征不如 Domain Module 明显,但适于展现层使用。

图 1:实现所需工作量与业务逻辑复杂度的关系

应用建设初期选择的实现模式随着业务需求和历史数据量的变化可能需要进行调整,此时要增加一个适应性机制,保证在尽量不影响客户程序的前提下,选择合适的实现模式。随着 XML 数据使用日趋广泛,须借助 XPath、XQuery 和 XSL 为层次型数据增加专门的扩展机制,使得基于 XML 数据源的业务逻辑也可以采用上述三种模式实现。

概要设计

整体逻辑结构

总体适配机制如下:

图 2:总体实现结构

为业务服务增加抽象接口 IDomainService,客户程序通过 DomainServiceFactory 获得该抽象接口,这样客户程序不依赖于具体的业务服务实体类,仅依赖于抽象的服务接口,当下层实现模式调整时,不影响客户程序;为了让框架可以同时适应关系数据库和 XML 数据,增加了抽象接口 IDataSource,代表不同的数据源对象;IDataMapper 负责根据不同的数据源,完成关系数据或 XML 数据与业务对象的映射;为了减少 DomainServiceFactory 与具体业务服务对象产生依赖,增加配置管理对象 ConfigManager,由它获取指定的业务服务的实体类名称,并通过反射机制动态生成目标实例。

性能改进

由于业务实体经常会对应到具有 Master-Detail 关系的多个表,而且有些复杂业务实体本身会包含一组或几组其它业务实体,出于性能考虑,为了避免 IDataMapper 在映射过程中频繁调用数据源逐个生成子业务实体,需要在 IDataMapper 与数据源之间增加一个 DTO(Data Transfer Object) 对象 IDataTransferObject,通过将调用打包的办法,减少频繁的远程调用。

图 3:借助 DTO,Domain Module 对象间接访问数据源

详细设计

面向关系数据库的业务服务设计

为了将业务实体纳入适配机制的管理,依据依赖倒置原则,先对各模式实现的业务实体进行抽象。

图 4: 关系数据库方式下的适配机制

为每种模式实现的业务对象抽象独立接口,并编写对应的关系数据库实现类;Domain Module 需要调度数据映射和 DTO 进行关系数据与业务实体的映射;增加抽象基类 DomainModuleBase,通过调用 IDataMapper 和 IDataTransferObject 完成数据提取和映射工作。

表 1:关系数据库下三种模式的执行特征

面向 XML 数据的扩展设计

由于 XML 的层次特征,3 个模式的实现技术与关系数据库不同:

表 2:XML 数据下三种模式的执行特征

图 5: XML 数据方式下的适配机制

配置机制设计

通过增加服务接口工厂类的方式隔离客户程序与具体业务服务实体类间的依赖,工厂类通过配置管理 ConfigManager 获得每个目标服务接口对应的实体类名称,借助反射动态包装目标服务接口。静态结构和执行过程如下:

图 6:配置管理机制

图 7:客户程序获得业务服务接口的时序关系

实验环境准备及实验结果分析

测试业务对象

为了比较三种模式实现特点的不同,测试中设计了 2 个具有 Master-Detail 特征的业务实体:Customer 和 Order,两者之间也存在 1:N 的关系,对应的关系数据库和 XML 数据实现如下:

图 8:业务实体

图 9:关系数据库方式下业务实体实现

图 10:XML 数据方式下业务实体的实现

目标服务是一个根据客户名称,返回其所有订单明细项小计之和的接口。

测试内容准备

针对关系数据库和 XML 数据方式的不同,业务逻辑如表 3。其中,XML 数据的 Transaction Script 模式为了计算简单,增加一个采用 XSTL 生成 “客户名称—订单项明细小计”的中间过程:

图 11:XML

Transaction Script 方式下生成中间结果的 XSLT

表 3:两种数据模型下三个实现模式的计算方法

测试数据

表 4:测试数据

测试结果及分析

通过修改 ConfigManager 中实现业务服务的实体类名称,结合数据库调用监控获得如下数据:

表 5:测试结果

测试结果分析如下:

1)借助适配机制,在目标实现模式甚至数据模型修改时,客户程序保持稳定,修改内容控制在配置文件部分,不影响客户程序的业务逻辑;

2)使用不同模式设计完成的业务对象,借助适配机制和 XML 数据扩展机制,在关系数据库和 XML 数据方式下,可完成同样的服务功能;

3)通过 DTO 组件的调用打包作用,可以将包括 2 份订单、4 项订单明细的信息一次性提取,将多次调用打包为 1 次调用,减少了网络往复。

总结

依据依赖导致原理设计的适配机制可以从一定程度上减少客户程序与业务逻辑的耦合程度,在部署、运行环境变化时,可通过调整配置选择合适的业务逻辑实现模式,并且不需要客户程序联动修改;DTO 对象的加入可以减少分布式调用中的往复次数,对应用性能的提升有利。实际工程中,由于业务逻辑实体往往需要被多个客户程序调用,需要有效的并发机制配合,后续研究中将着重对并发能力进行调整。

参考文献:

[1] Fowler, Martin 著,Patterns of Enterprise Application Architecture

[2] Biping Joshi 著,Pro .Net 2.0 XML

源代码下载: DomainMechanism

2007-10-30 22:561572
用户头像

发布了 61 篇内容, 共 11.0 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

老板:把系统从单体架构升级到集群架构!

程序员 架构 分布式 后端 计算机

PhxSQL设计与实现(详细版)

OpenIM

各编程语言里对 Iterator 进行修改时的对比

BlockQuant

Java Python rust Go 语言

用数据搭建反馈系统

石云升

数据分析 9月日更

微信亿级用户异常检测框架的设计与实践

OpenIM

微信开源PhxQueue:高可用、高可靠、高性能的分布式队列

OpenIM

活动推荐 | 云原生社区 Meetup 第七期深圳站开始报名啦!

CODING DevOps

Kubernetes DevOps 微服务 活动 Meetup

北鲲云超算平台赋能蛋白设计助推生物制药行业发展

北鲲云

内核模式(Kernel Mode)vs 用户模式(User Mode)

飞鸟

webrtc NACK与RTX

webrtc developer

WebRTC NACK

我们是如何在研发过程中控制质量的?产品质量正变得越来越重要

爱数技术范儿

大数据 软件工程

广告机主板定制方案能实现双屏异显或四屏异显吗?

双赞工控

安卓主板 主板定制 广告机主板

justswap市值管理机器人系统软件开发技术(案例搭建)

量化系统19942438797

交易所 做市机器人 justswap

Python代码阅读(第25篇):将多行字符串拆分成列表

Felix

编程 Code Programing 阅读代码 -python

5 款阿里常用代码检测工具,免费用!

阿里巴巴云原生

阿里云 云原生 云效

计算机工业的生态链(一)

姬翔

9月日更

消息系统的演进:从MOM、ESB到下一代云原生的分布式消息系统

金蝶天燕云

分布式消息

恰逢金九银十!阿里P8连夜赶稿一份基于实例驱动的设计模式笔记

Java 编程 架构 面试 阿里

腾讯云签约广州知识城商用密码项目,助力黄建设密码产业示范区

腾讯安全云鼎实验室

腾讯云 商用密码

Redis 6.0 多线程重磅发布!来了解一下吧

Linux服务器开发

数据库 redis 网络编程 Linux服务器开发 单线程

你们想知道的一切,都在这里了。

ApacheDoris

Apache 开源社区

APM领域国产化先锋!博睿数据与麒麟、统信、中科方德完成兼容性认证

博睿数据

架构实战营模块 7 作业指导

华仔

架构实战营

多租户是一种技术

金蝶天燕云

多租户

熬了3天2夜,啃完阿里(珠峰版)Java面试笔记,直接斩获12家大厂offer,

Java架构师迁哥

HashMap为什么是线程不安全的?

Java技术精选

白嫖!一口总结了金九银十(P5-P7级)1000多道Java面试题,20+大厂必考点及Java面试框架知识点!

Java 程序员 架构 面试 计算机

关系型数据库,NoSQL数据库,NewSQL数据库权威整理

hanaper

白瞟党福音!Alibaba内部最新Java开发手册(嵩山版)灵魂17问

Java 编程 架构 面试 架构师

博睿数据云主机性能评测新增6家云厂商,8月报告亚马逊云科技登榜首

博睿数据

五行兼备:联想TruScale服务的太极之道

脑极体

面向XML的领域建模设计_.NET_王翔_InfoQ精选文章