`
pesome
  • 浏览: 68689 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

openfans领域模型驱动的尝试

阅读更多

领域模型驱动( Domain Driven Design ),很热的名词。 Openfans ,不太热的网站。今天俺就借着很热的 ddd ,给不太热的 openfans 再造点势。 Openfans 就不多介绍了,网站用 spring+hibernate 为核心的一堆开源软件构建。有了 spring IOC hibernate ORM ,打着 ddd 的旗号也就名正言顺了很多。先声明其实俺对 ddd 的理解也多是道听途说,没有什么系统的学习过,倒是和 Joe 阿牛讨论过几次,颇有受益,他对这个理解还是很深刻的。

言归正传,就讲 openfans 现在经 ddd 思想改造过的模型。整体上看还是普通的三层架构体系:展现层、业务层、持久层。展现层用 spring mvc ,力图做到只是展示相关,避免出现业务逻辑。再具体细分,就是 jsp 页面只有展示逻辑,主要使用 jstl 完成显示功能。 Controller 负责从页面获得参数、把数据传回页面、控制页面流传和调用业务层的接口。持久层使用 hibernate ,在设计上我不是按 dao 方式为每个对象建立相应的 dao ,也不是 ddd 推荐的每个 domain 一个 repository ,而是分成了 Persistence Fetcher2 个接口。 Persistence 处理持久相关如 save remove 方法, Fetcher 则处理 get 相关。这样分的原因也很简单, persistence 是很稳固的,对象都可以共用一个接口如 save Object ),而 fetcher 就千变万化,需要分页、排序等接口。

这样设计是与业务层架构相关的。我采用的是 domain 对象(简称 DO + 一层薄薄 façade 的方式。 DO 处理自身的逻辑,包括持久功能。本身 DO 是没有持久能力的,需要依靠注入的 persistence 接口,这里就体现按 Persistence Fetcher 分开的一个好处, persistence 所有 DO 可以共用一个,给编程带来了方便。 Openfans 中采用的是 DO 继承一个抽象 PersistentObject 类的方式,这样 DO 方便的获得了注入的能力和持久的能力。这样做有何优缺点还需要做些讨论,为了方便我也就先这么用。 PersistentObject 代码如下:

public abstract class PersistentObject implements NeedPersist {

       private Persistence persistence;

<!----> <o:p> </o:p>

       public void save() {

              persistence.save(this);

<o:p> </o:p>

       }

<o:p> </o:p>

       public void remove() {

              persistence.remove(this);

       }

<o:p> </o:p>

       public void setPersistence(Persistence persistence) {

              this.persistence = persistence;

       }

<o:p> </o:p>

       public Persistence getPersistence() {

              return persistence;

       }

}

这样 DO 只需要注入 persistence 就获得了持久的能力,而且可以把这种能力往下传递。 DO 获得了持久能力,就有点接近富血模型的想法了,他能够处理一些业务,做持久然后调用引用对象的业务和持久方法 ( 从另外的角度看持久与业务其实是分不开的 ) 。这样把业务封装在了领域本身,更适于用领域对象出发的方式去思考问题。领域层的 façade 主要是为了 Transaction 管理和隐藏 DO 接口。这样 DO 的业务方法都可以设置成 friendly ,仅相互间可见。 Façade 就放在 domain 包中,它负责给 DO 注入 persistence bean ,调用 DO 的接口,提供给 controller 一个 use case 级别的接口,同时它也代理 fetcher 的接口。

有了这个架构,实现起来也不复杂,要配置的 bean 很少(现在还没有使用 spring 2.0 DO 配置在容器中)。设计就从 DO 出发,明确它的属性和方法,让 hibernate 自己生成数据库表。

       这样设计也算是一次尝试吧,其中肯定有很多考虑不周的地方,需要不断的讨论和改进。

分享到:
评论

相关推荐

    模具状态监测行业发展趋势:预计到2030年市场规模为5.06亿美元

    模具状态监测市场:6.8%的年复合增长率引领制造业智能化升级 在快速发展的制造业中,模具作为生产过程中的核心部件,其状态直接影响到产品的质量和生产效率。然而,模具的损耗和故障往往难以预测,给企业带来不小的损失。如今,随着模具状态监测技术的兴起,这一切正在发生改变。这项创新技术不仅能够帮助企业提前发现模具的潜在问题,还能显著延长模具的使用寿命,提升生产效率。但你真的了解这个市场的潜力和现状吗?让我们一同揭开模具状态监测市场的神秘面纱。 市场概况: 根据QYR(恒州博智)的统计,2023年全球模具状态监测市场的销售额已经达到了3.2亿美元,预计到2030年,这一数字将攀升至5.06亿美元,年复合增长率高达6.8%。这一显著的增长背后,是制造业对智能化、自动化生产需求的不断提升,以及模具状态监测技术在提高生产效率、降低维护成本方面的显著优势。 技术创新与趋势: 模具状态监测技术主要依赖于传感器、数据分析和处理等技术手段,能够实时采集模具的温度、振动、压力等指标,并通过与预设参数的比对,及时识别模具的异常情况。随着物联网、大数据和人工智能等技术的不断发展,模具状态监测技术将更加智能化,能够提供

    Kubernetes DevOps实践工作坊-从理论到实战操作脚本集(含源码).zip

    Kubernetes DevOps实践工作坊-从理论到实战操作脚本集(含源码).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)

    基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设),个人经导师指导并认可通过的毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springboot+vue3+uniapp的点餐小程序源代码+数据库+文档说明(高分毕设)基于springb

    欧姆龙NX1P2系列总线plc程序 自动检测机,plc程序,无触摸屏程序 1.多工位DDR马达转盘控制,多工位同时加工 2.多产品配方功能程序 3.各种实用型自制功能块程序,可重复调用,成熟设备

    欧姆龙NX1P2系列总线plc程序 自动检测机,plc程序,无触摸屏程序 1.多工位DDR马达转盘控制,多工位同时加工。 2.多产品配方功能程序。 3.各种实用型自制功能块程序,可重复调用,成熟设备

    企业微信最全养号、防封、加人机制.pdf

    企业微信最全养号、防封、加人机制.pdf

    LLM 友好的异步爬虫框架

    这是一款用 Python 开发的异步爬虫框架,能够将网站上的数据转化成 Markdown、JSON 等 LLM 友好的输出格式。它完全开源且免费,极大地简化了异步爬虫的编写。相比于付费的 Firecrawl,它具有更快的爬取速度,支持同时抓取多个 URL、页面截图、关键字优化提取(基于 LLM)和复杂的多页面会话管理等功能。

    毕设Python春节电影信息爬取与可视化分析源码+项目说明+全部资料.zip

    毕设Python春节电影信息爬取与可视化分析源码+项目说明+全部资料.zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    2019厦门国际银行数创金融杯源码+竞赛策略报告文档.zip

    2019厦门国际银行数创金融杯源码+竞赛策略报告文档.zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)

    基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业),个人经导师指导并认可通过的毕业设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开发的安卓的记事本app项目源码(高分期末大作业)基于Android Studio开

    基于java的小区智能卡管理系统设计与实现.docx

    基于java的小区智能卡管理系统设计与实现.docx

    NLP中文垃圾短信分类系统源码+设计全部资料+文档报告(自然语言处理课设).zip

    NLP中文垃圾短信分类系统源码+设计全部资料+文档报告(自然语言处理课设).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    电源滤波器车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF 角阶跃输入+整车7自由度模型+UKF状态估计模型+附送EKF状态估计模型,针

    电源滤波器车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF 角阶跃输入+整车7自由度模型+UKF状态估计模型+附送EKF状态估计模型,针对于轮毂电机分布式驱动车辆,进行车速,质心侧偏角,横摆角速度估计。 模型输入:方向盘转角delta,车辆纵向加速度ax 模型输出:横摆角速度wz,纵向车速vx,质心侧偏角β

Global site tag (gtag.js) - Google Analytics