DDD lazy-load 是反模式?

13-04-17 2012
看了很多外文贴和文章, 一些人说lazy-load是反模式, 理由是: 如果一个Aggregate需要加载太多数量的元素, 那这个模型就是有问题的. 但同时几乎没人给出一个合理的解决方案.

比如说一个Clazz聚合, 包含一个List<Student> students, 而后者的数量可能超过1万, 每个Student又包含更多其他Entity. 业务逻辑多数情况下不需要对 students进行操作( 比如修改Clazz的名称之类的)

如果对students的操作是只读, 那么CQRS应该可以解决, 但Clazz可能需要批量修改每一个学生的信息.

这类模型应该如何设计?

         

tangxuehua
2013-04-17 18:48
首先你拼写错误,不是叫clazz,而是叫class吧

另外,为什么class要聚合student。student完全就是独立聚合根才对。

banq
2013-04-17 18:54
2013-04-17 18:40 "@2102

"的内容

一些人说lazy-load是反模式, 理由是: 如果一个Aggregate需要加载太多数量的元素, 那这个模型就是有问题的. ...

我认为:Lazyload反模式和Aggregate加载太多是两个问题。

我在Jdonframework提供一种lazy evaluation懒赋值,区别于普通懒加载,可以想加载什么加载什么,只要你不嫌编码麻烦,比如User中有一个图片使用懒赋值:代码按这里,代码中使用事件进行二次加载,第一次触发,第二次再访问user.getUpload时,将会得到数据库中的图片。

关于Aggregate加载太多问题,DDD提出另外一种Repository查询替代模型遍历的方法。如果子对象有一万多,那无疑模型设计有问题,直觉子对象应该聚合根,而不是其父对象,父对象可能是聚合根的值对象描述而已,如产品和产品目录一样。

[该贴被banq于2013-04-17 18:56修改过]

2012
2013-04-17 19:00
2013-04-17 18:48 "@tangxuehua

"的内容

首先你拼写错误,不是叫clazz,而是叫class

另外,为什么class要聚合student。student完全就是独立聚合根才对。 ...

额java中clazz写习惯了... csharp 倒是可以用@class

聚合关系只是演示, 换成别的也一样. 姑且假定我的业务就是"班级管理"而不是"班级和学生管理"吧 : -)

我想问的是, lazy-load主要是为了解决性能, 如果是它反模式, 那么替代方案是啥?

banq
2013-04-17 19:10
2013-04-17 19:00 "@2102

"的内容

lazy-load主要是为了解决性能, 如果是它反模式, 那么替代方案是啥 ...

我前面提了:Lazy_evaluation:http://en.wikipedia.org/wiki/Lazy_evaluation,这其实是函数语言一个特点。

猜你喜欢
2Go 1 2 下一页