知识卡片

多层信息系统无法像桌面应用一样整体导入对象图

普通读书笔记卡

内容

使用领域模型时,最简单的场景是单用户桌面应用——整个对象图可以从一个文件里整体读出、放进内存,程序运行期间就一直待在那儿。但多层信息系统通常无法这样做,原因很朴素:系统里的对象实在太多了,把每一个对象都塞进内存既耗费太多空间,导入过程本身也会耗费太长时间。面向对象数据库的一个核心优势正是能替你管理这种”对象导入”——让对象在内存和磁盘之间按需迁移;但如果没有面向对象数据库(企业应用的常态),这份管理工作就得自己来做:通常一次会话只会把和当前任务相关的那部分对象图导入内存——比如只处理合同和收入确认对象上的计算时,可能完全不需要导入任何产品对象;具体导入哪些对象,由数据库映射对象来控制(这正是延迟加载要解决的问题)。另外,如果希望跨多次服务器调用复用同一个对象图,就必须把这份”部分加载的状态”保存在某处——这正是会话状态要处理的问题。可迁移启发:领域模型看似只是一套面向对象的建模方法,但一旦离开单机场景,它天然会牵扯出”该加载哪些对象”“状态该存哪儿”这两个跨层协作问题——评估要不要上领域模型时,这两个问题的解法(延迟加载策略、会话状态存储方式)也该一并纳入成本考量,而不只是看建模本身的复杂度。

参考来源

- 位置:《企业应用架构模式》第二部分"模式"之"第9章 领域逻辑模式"之"9.2 领域模型"(源文件:_epub-src/OEBPS/Text/000064.html) - 结论依据:原文说明"桌面应用程序可能会以这种方式工作,但多层的信息系统通常并非如此,原因很简单——其中的对象太多了。将每一个对象都放到内存中会消耗太多的内存空间,而且导入的过程会耗费很长时间……通常,一次会话将涉及把由所有有关的对象组成的一个对象图导入到内存……将哪些对象导入内存是由系统中的数据库映射对象来控制……如果希望多次服务器调用时都使用同一对象图,就必须将服务器的状态保存在某处",直接支撑本卡结论。 - 原始内容:如果只是在合同和收入确认对象上进行一些计算,你可能不会导入任何产品对象。将哪些对象导入内存是由系统中的数据库映射对象来控制。