【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

面向 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:561418
用户头像

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

关注

评论

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

专利解析|数据中台—数据流配置弹框交互优化方法

元年技术洞察

数据中台 数字化转型 专利解析

HTTP报文内容

穿过生命散发芬芳

HTTP 12月月更

小游戏流量变现都有哪些窍门?

FinFish

小游戏 微信小程序-游戏 小程序游戏 微信小游戏

参加大数据培训可以找到工作吗

小谷哥

智能合约DAPP开发WEB3.0系统搭建技术

薇電13242772558

智能合约

我把传统业务架构升级到业务中台架构的心得

软件工程师-罗小东

Java程序员培训机构怎么选

小谷哥

RocketMQ Schema——让消息成为流动的结构化数据

Apache RocketMQ

RocketMQ

汽车之家基于 Milvus 的向量检索平台实践

Zilliz

数据库 向量检索 Milvus

Laravel中HasOne和BelongsTo的区别

ModStart

阿里云视觉智能开放平台——人脸活体检测算法重磅升级

夏夜许游

服务升级 人脸活体检测 人脸人体

直播|HashData信创概览

酷克数据HashData

信创

培训班出来前端程序员好找吗?

小谷哥

企业转型难?火山引擎数智平台提供数智升级新路径

字节跳动数据平台

大数据 数据中台 12 月 PK 榜

Amazon 4.7 星评,领域新经典,了解服务设计就读它

图灵社区

产品经理 设计模式 服务设计

大咖说·开源人说|数据库 PolarDB 开源的商业逻辑与价值思考

大咖说

数据库 阿里云 开源

新华三推出人工智能模型训练平台,让智慧算力触手可及

脑极体

隐匿于喧嚣城市的世外桃源,「武汉浮生艺术馆」开放小程序预约通道,顺利举办多场艺术展览

天天预约

小程序 SaaS 预约工具 展览 艺术馆

在新基建数字化的时代,寻找自我的突破和价值创造

软件工程师-罗小东

我对中台的理解和企业数字中台建设的思考

软件工程师-罗小东

【FAQ】申请Health Kit权限的常见问题及解答

HMS Core

HMS Core

Celestia 简介:重新构想的区块链

devpoint

区块链 以太坊 12月月更 Celestia

数据存储,消息队列的高可用保障

C++后台开发

数据库 数据结构 消息队列 后端开发 linux开发

如何优化大场景实时渲染?HMS Core 3D Engine这么做

HMS Core

HMS Core

重磅!TDengine 3.2.0 正式发布

TDengine

数据库 tdengine 时序数据库

我对管理角色带团队的一些经验分享

软件工程师-罗小东

自动化测试技术笔记(二):准备工作的切入点

老张

自动化测试

【经验总结】HDI与普通PCB的4点主要区别

华秋PCB

工艺 PCB PCB设计

我把整个研发中台拆分过程的一些心得总结

软件工程师-罗小东

学习掌握哪些前端技术才能找到好工作?

小谷哥

软件测试培训 | 在霍格沃兹测试开发学社学习是种怎样的体验?

霍格沃兹测试开发学社

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