当前位置: 首页 > news >正文

关于领域模型与技术架构的关系的思考

人类社会的一切事物都是来源于对造物主智慧的学习,人类本身是不会创造任何东西的。

外国新技术并不能作为软件架构的终极准则,因为老外也是人。我认为客观世界的架构应该是软件架构的唯一准则,换而言之,上帝也是一个架构师,而这个客观世界就是他的作品。

有这么完美的学习对象,为什么要舍本逐末呢?

就拿领域对象的设计来说,在客观世界中,人如果要做某件事情,比如扫地这个动作,扫地难道是人自己完成的吗?其实扫地是人借助扫帚这个工具完成的。

换而言之,领域对象的一些动作,也根本不属于他自己,如果你把这些动作硬要强加在领域对象身上,就肯定会出现类似领域对象中调用技术层这种别扭的问题。

比如,经常有什么贫血对象,和充血对象之类的讨论,这其实很可笑,保存、删除、这些概念,本身是在计算机领域才存在的概念,现在大家都想把他强加在领域对象上,领域对象本身是对业务的模拟,怎么可能有这些动作?大家也觉的不妥,于是就绕弯弯,想发明一种说法和思想,自己说服自己,让这件事情变的合理。但是这在本质上就是错误的,这种追求也是徒劳的。

DOMAIN就应该只关注于领域对象之间的关系和行为就足够了,涉及到技术的,都交给其他层完成,而不是非要在DOMAIN中加上技术性的操作,你觉得别扭,这是必然的,因为在原本的业务概念中,根本不存在这中技术性的概念!领域对象,应该仅仅关注自身状态和行为,以及和其他领域对象之间关系的建立,至于一切计算机领域的概念(比如保存、删除这些概念),都不应该出现在领域对象中,因为这是违背自然规律的组合,或者说是违背业务概念的。

领域模型中的对象之间既然有关系,就肯定需要相互协作共同完成某个更大的业务逻辑;那么如何协作呢?目前最优雅并能确保领域对象处于核心主动地位的方式是通过Domain Event;在C#,Java这样的语言中,对象天生并不具备发送消息和接收消息的能力,需要依赖于外部框架;而像Scala的Akka那种Actor Model,一个领域对象就是一个Actor,Actor能够通过发送异步消息和其他Actor通讯联系,这种消息发送是异步的,属于“fire-and-forget”方式。那么在C#这样的语言下,我们可以通过Domain Event也可以达到类似Actor一样的效果;

Domain Event是EDA(Event Driven Architecture)思想的一种体现,EDA原本是用于SOA(Service Oriented Architecture)中,服务与服务之间的通信;Domain Event则是将EDA用于领域对象之间的通信;

引入Domain Event主要目的是为解决如何将领域模型和技术架构进行解耦,让领域模型不依赖于特定的技术架构实现,从而可以让领域模型真正反映纯粹的业务模型。

相关文章:

  • 学会容器服务帮你打造Docker云端最佳运行环境
  • ASP.NET中 ListView(列表视图)的使用前台绑定
  • 1507 酒厂选址
  • win10系统的简单优化
  • Unity VR全景漫游
  • 查找、移除某个视图上的某类控件
  • linux 巨页使用测试以及勘误1
  • CSS使图片变灰
  • js跨域
  • 把sublime3打造成c++开发环境
  • 对未来的想法
  • android开发之集成zxing,二维码,以及扫描二维码的功能实现。带源代码下载
  • CSS基础
  • php do while循环实例
  • system.web下的HttpModules节点和system.webServer下的modules节点的配置区别
  • 【译】JS基础算法脚本:字符串结尾
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 2017年终总结、随想
  • avalon2.2的VM生成过程
  • Github访问慢解决办法
  • Git初体验
  • Gradle 5.0 正式版发布
  • Java,console输出实时的转向GUI textbox
  • JAVA并发编程--1.基础概念
  • jQuery(一)
  • Linux链接文件
  • Python打包系统简单入门
  • Python学习之路16-使用API
  • TypeScript迭代器
  • 从0实现一个tiny react(三)生命周期
  • 订阅Forge Viewer所有的事件
  • 浮动相关
  • 老板让我十分钟上手nx-admin
  • 普通函数和构造函数的区别
  • 前端_面试
  • 前端性能优化——回流与重绘
  • 深度学习在携程攻略社区的应用
  • 微信支付JSAPI,实测!终极方案
  • 一天一个设计模式之JS实现——适配器模式
  • 移动端唤起键盘时取消position:fixed定位
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​一些不规范的GTID使用场景
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #QT(智能家居界面-界面切换)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (11)MSP430F5529 定时器B
  • (13):Silverlight 2 数据与通信之WebRequest
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (20050108)又读《平凡的世界》
  • (2020)Java后端开发----(面试题和笔试题)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度