JiveJdon Community Forums
在线308人 J道首页 | 论坛首页 | 培训咨询 | 开源框架 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 8 回复 / 1 页 [ ]  发表新帖子  回复该主题贴
windflaw

发表文章: 18
注册时间: 2007年03月01日 16:58
Entity中是否可以引用Repository 发表: 2007年04月23日 17:16 回复
DDD里讲的Repository用于对一个entity的重建,因此Repository依赖于entity是很正常的一个关系。但是在使用中,会遇到entity本身需要访问数据库,如果调用repository来访问的话,变成了双向依赖,感觉不好。

例如:一个entity叫排班表,它下面对应每一天的班次安排。它们间算是一个聚合体吧。可以写成这样:
public class WorkShiftSchedule // 排班表
{
public IList DayArrangeList; // 每日的班次安排列表。
}
public class DayArrange // 每日排班明细
{
public WorkShiftSchedule OwnerSchedule; // 所属的排班表
public DateTime Day; // 日期
public WorkShift WorkShiftPlan; // 安排的班次
}

但是,几年下来,明细信息越来越多,显然用IList这样的数据集就算用Lazy Load性能会出现很大问题。为了查某一周的排班信息,却要载入好几年的排班明细,显然不合理。DDD里提到了,如果数据集不合适,可以选用查询。想想也合乎业务需要,因为从用户角度,不需要载入所有明细,只需要某天,或某个月内的排班情况。于是我改成了:
public class WorkShiftSchedule
{
public IList GetMonthArranges(string month){}
public DayArrange GetDayArrange(DateTime day){}
}

我的问题也因此产生了,GetMonthArranges需要查询,那么是否写成:
public IList GetMonthArranges(string month)
{
return WorkShiftScheduleRepository.QueryDayArranges(this, month);
}

public class WorkShiftScheduleRepository
{
public static IList QueryDayArranges(WorkShiftSchedule schedule, string month){}
}


但一直觉得这样似乎变成了Repository和Entity之间双向依赖,容易造成混乱。但依DDD里说的,DayArrange又是从属于WorkShiftSchedule这个根的,所以一切访问要通过WorkShiftSchedule。不然直在外部用Repository来查询就好了,不经过WorkShiftSchedule。一直疑虑,还望前辈们指点迷津。

[该贴被windflaw于2007年04月23日 21:15修改过]
banq

发表文章: 8933
注册时间: 2002年08月03日 17:08
回复:Entity中是否可以引用Repository 发表: 2007年04月25日 09:55 回复
Evans DDD中在讲Repository之前,不是先讲Factory,通过使用工厂获得对象或集合啊.

既然谈到了工厂,那么就是指GoF模式的Factory模式,工厂模式有两个角色:工厂和产品,无疑Entity是产品,而且工厂一般是不放在产品里面的,因为不可能通过事物的自己获得自己啊.
windflaw

发表文章: 18
注册时间: 2007年03月01日 16:58
re:Entity中是否可以引用Repository 发表: 2007年04月26日 10:07 回复
正是因为Entity不应引用Repository,所以才有我这个疑问。但DayArrange从业务上属于WorkShiftSchedule这个聚合体里,应该没有异议吧,DDD里讲到从属的entity只能通过聚合根来访问,同时加上DayArrange的数量巨大,不宜用集合IList的方式,只能用查询,那么这个问题怎么解决呢?
banq

发表文章: 8933
注册时间: 2002年08月03日 17:08
回复:re:Entity中是否可以引用Repository 发表: 2007年04月26日 10:38 回复
櫴加载,需要的时候再加载.Hibernate等技术可实现,如果SQL则要自己做动态代理.我是打个折,通过借道服务来实现.


windflaw

发表文章: 18
注册时间: 2007年03月01日 16:58
回复:回复:re:Entity中是否可以引用Repository 发表: 2007年04月26日 11:28 回复
lazy load 好象是一次性取出所有的集合内容,可是象我例子里的DayArrange集合很大,而实际只需查询一小部分。DDD里说了,简化关系时,可以加上约束。加了约束,相当于用查询的方式了。所以lazy load好象也不理想
windflaw

发表文章: 18
注册时间: 2007年03月01日 16:58
re:Entity中是否可以引用Repository 发表: 2007年05月12日 23:04 回复
还是没有答案,继续顶
banq

发表文章: 8933
注册时间: 2002年08月03日 17:08
回复:re:Entity中是否可以引用Repository 发表: 2007年05月14日 09:23 回复
我的做法是"通过借道服务来实现",通过服务,将Entity和它的大批量子对象使用专门批量查询组件实现。例如Jdon框架就提供批量查询快速实现,可参考JiveJdon3源码

相关问题:
关于DDD的思考
http://www.jdon.com/jivejdon/thread/31792.html

欢迎大家讨论。
[该贴被banq于2007年05月21日 09:37修改过]
ulswww

发表文章: 2
注册时间: 2007年03月17日 20:52
re:Entity中是否可以引用Repository 发表: 2007年05月22日 16:58 回复
我认为还是业务没有分析的清楚
为什么会把许多年代数据放到一个对象里,是否真有这样的需求,是否可以分开。
还有你说每次也不用查那么多数据,模型是否应该从这个地方进行精化
custjcy

发表文章: 1
注册时间: 2007年07月10日 12:01
回复:re:Entity中是否可以引用Repository 发表: 2007年07月10日 12:14 回复
对模型的精化很难解决这个问题,因为存在这样的场景:需要哪些对象是无法预先确定,必须要根据Entity中的运行时逻辑决定。

有两个方法解决这个问题:
1. 将对应的逻辑上一到它的调用者。
2. Entity中增加事件或者代理,Entity通过事件机制或代理取得需要的数据。Entity的调用者捕获并处理事件或实现代理。
这个主题有 8 回复 / 1 页 [ ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-07 jdon.com

anti spam