|
|
|
Entity中是否可以引用Repository
作者:windflaw
发表时间:2007年04月23日 17:16
回复
原贴网址:
http://www.jdon.com/jivejdon/thread/31594.html
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修改过]
|
|
回复:Entity中是否可以引用Repository
|
发表: 2007年04月25日 09:55
|
回复
|
|
|
|
Evans DDD中在讲Repository之前,不是先讲Factory,通过使用工厂获得对象或集合啊.
既然谈到了工厂,那么就是指GoF模式的Factory模式,工厂模式有两个角色:工厂和产品,无疑Entity是产品,而且工厂一般是不放在产品里面的,因为不可能通过事物的自己获得自己啊.
|
|
|
|
re:Entity中是否可以引用Repository
|
发表: 2007年04月26日 10:07
|
回复
|
|
|
|
|
正是因为Entity不应引用Repository,所以才有我这个疑问。但DayArrange从业务上属于WorkShiftSchedule这个聚合体里,应该没有异议吧,DDD里讲到从属的entity只能通过聚合根来访问,同时加上DayArrange的数量巨大,不宜用集合IList的方式,只能用查询,那么这个问题怎么解决呢?
|
|
|
|
回复:re:Entity中是否可以引用Repository
|
发表: 2007年04月26日 10:38
|
回复
|
|
|
|
櫴加载,需要的时候再加载.Hibernate等技术可实现,如果SQL则要自己做动态代理.我是打个折,通过借道服务来实现.
|
|
|
|
回复:回复:re:Entity中是否可以引用Repository
|
发表: 2007年04月26日 11:28
|
回复
|
|
|
|
|
lazy load 好象是一次性取出所有的集合内容,可是象我例子里的DayArrange集合很大,而实际只需查询一小部分。DDD里说了,简化关系时,可以加上约束。加了约束,相当于用查询的方式了。所以lazy load好象也不理想
|
|
|
|
re:Entity中是否可以引用Repository
|
发表: 2007年05月12日 23:04
|
回复
|
|
|
|
|
|
|
|
回复:re:Entity中是否可以引用Repository
|
发表: 2007年05月14日 09:23
|
回复
|
|
|
|
|
|
|
|
re:Entity中是否可以引用Repository
|
发表: 2007年05月22日 16:58
|
回复
|
|
|
|
我认为还是业务没有分析的清楚 为什么会把许多年代数据放到一个对象里,是否真有这样的需求,是否可以分开。 还有你说每次也不用查那么多数据,模型是否应该从这个地方进行精化
|
|
|
|
回复:re:Entity中是否可以引用Repository
|
发表: 2007年07月10日 12:14
|
回复
|
|
|
|
对模型的精化很难解决这个问题,因为存在这样的场景:需要哪些对象是无法预先确定,必须要根据Entity中的运行时逻辑决定。
有两个方法解决这个问题: 1. 将对应的逻辑上一到它的调用者。 2. Entity中增加事件或者代理,Entity通过事件机制或代理取得需要的数据。Entity的调用者捕获并处理事件或实现代理。
|
|
|
|
|