JiveJdon Community Forums
在线192人   首页   主题表   培训咨询   标签   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
RSS google yahoo 365Key网摘 CSDN网摘 添加到百度搜藏 POCO网摘 新浪ViVi QQ网摘
???en_US.forumThreadNext.name??? 下一主题
1 2 Go 共有 16 回复(2页) 阅读531次
 发表新帖子   回复该主题贴
windflaw



发表文章:
注册时间: 2008年08月04日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
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



发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 70人关注
回复:Entity中是否可以引用Repository 2007年04月25日 09:55 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
Evans DDD中在讲Repository之前,不是先讲Factory,通过使用工厂获得对象或集合啊.

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



发表文章: 20
注册时间: 2008年08月04日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:Entity中是否可以引用Repository 2007年04月26日 10:07 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
正是因为Entity不应引用Repository,所以才有我这个疑问。但DayArrange从业务上属于WorkShiftSchedule这个聚合体里,应该没有异议吧,DDD里讲到从属的entity只能通过聚合根来访问,同时加上DayArrange的数量巨大,不宜用集合IList的方式,只能用查询,那么这个问题怎么解决呢?
banq



发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 70人关注
回复:re:Entity中是否可以引用Repository 2007年04月26日 10:38 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
櫴加载,需要的时候再加载.Hibernate等技术可实现,如果SQL则要自己做动态代理.我是打个折,通过借道服务来实现.


windflaw



发表文章: 20
注册时间: 2008年08月04日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
回复:回复:re:Entity中是否可以引用Repository 2007年04月26日 11:28 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
lazy load 好象是一次性取出所有的集合内容,可是象我例子里的DayArrange集合很大,而实际只需查询一小部分。DDD里说了,简化关系时,可以加上约束。加了约束,相当于用查询的方式了。所以lazy load好象也不理想
windflaw



发表文章: 20
注册时间: 2008年08月04日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:Entity中是否可以引用Repository 2007年05月12日 23:04 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
还是没有答案,继续顶
banq



发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 70人关注
回复: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



发表文章:
注册时间: 2007年03月17日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:Entity中是否可以引用Repository 2007年05月22日 16:58 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
我认为还是业务没有分析的清楚
为什么会把许多年代数据放到一个对象里,是否真有这样的需求,是否可以分开。
还有你说每次也不用查那么多数据,模型是否应该从这个地方进行精化
custjcy



发表文章:
注册时间: 2007年07月10日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
回复:re:Entity中是否可以引用Repository 2007年07月10日 12:14 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
对模型的精化很难解决这个问题,因为存在这样的场景:需要哪些对象是无法预先确定,必须要根据Entity中的运行时逻辑决定。

有两个方法解决这个问题:
1. 将对应的逻辑上一到它的调用者。
2. Entity中增加事件或者代理,Entity通过事件机制或代理取得需要的数据。Entity的调用者捕获并处理事件或实现代理。
sonnylys



发表文章: 25
注册时间: 2008年01月25日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:Entity中是否可以引用Repository 2008年07月28日 23:24 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
>>>
public class DayArrange // 每日排班明细
{
public WorkShiftSchedule OwnerSchedule; // 所属的排班表
public DateTime Day; // 日期
public WorkShift WorkShiftPlan; // 安排的班次
}
但是,几年下来,明细信息越来越多,显然用IList这样的数据集就算用Lazy Load性能会出现很大问题。

从以上代码及描述来看,个人认为你所提的“明细信息越来越多”的“明细”为"DayArrange"; “几年下来,明细信息越来越多“,至此,从描述中得到的信息是:”DayArrange”和“WorkShiftSchedule”实际上没存在任何关系,不然的话,一个“WorkShiftSchedule”排班表不就按排了几年的“DayArrange“?
>>>
public class WorkShiftSchedule {
public IList GetMonthArranges(string month){}
public DayArrange GetDayArrange(DateTime day){}
}
从代码及描述来看,WorkShiftSchedule 更象是个service?不理解为什么说是entity,然后苦恼其依赖Repository!请指教,谢谢。


[该贴被sonnylys于2008-07-29 00:09修改过]
xmuzyu



发表文章: 425
注册时间: 2007年03月26日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 16人关注
re:Entity中是否可以引用Repository 2008年07月30日 19:55 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
WorkShiftSchedule是需要跟踪的,是要保存到数据库的,所以说是Entity.
banq



发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 70人关注
回复:re:Entity中是否可以引用Repository 2008年07月31日 11:47 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
关键还是设计分离的问题,要将持久化的实体和DDD的实体概念进行区分,而且DDD的实体也不是让你将所有业务逻辑都放到一个实体类中,然后将这个大实体类去保存数据库,这样做都是没有进行详细设计层面的考虑。

Evans DDD其实是分析模式和设计模式的牵手,也就是将这两者和谐统一了,对于我们初学者,只是学习Evans DDD是不够的,显然必要学习设计模式和分析模式,这两个基础踏实了,才能将DDD落实到实处,否则就是依葫芦画瓢。

关于OO与关系数据库阻抗的谈论
http://www.jdon.com/jivejdon/thread/34411.html
freebox



发表文章: 369
注册时间: 2008年03月01日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:Entity中是否可以引用Repository 2008年07月31日 21:43 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
按照仅存的一点化学知识理解,其实这像是分子是由原子构成的道理,而现在从整体上分析是要分析分子间的关系,但是实现的时候由于是由原子组成的所以还要分别实现原子。
windflaw



发表文章: 20
注册时间: 2008年08月04日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言
re:Entity中是否可以引用Repository 2008年08月04日 15:51 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
banq:我的做法是"通过借道服务来实现",通过服务,将Entity和它的大批量子对象使用专门批量查询组件实现。例如Jdon框架就提供批量查询快速实现

可不可以理解批量查询组件对应到领域模型中的service?
banq



发表文章: 11282
注册时间: 2002年08月03日
悄悄话
个人博客
在线? 当前离线
我要关注该作者发言 70人关注
回复:re:Entity中是否可以引用Repository 2008年08月05日 10:07 收藏关注本主题 到本帖网址 加入本帖到收藏夹 请用鼠标选择需要回复的文字再点按本回复键 回复该主题
>理解批量查询组件对应到领域模型中的service
可以
标签          
共有 16 回复(2页) Go 1 2
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
正在读取,请等待...
查询本论坛内 回复超过的热门帖子
标题
 
粗体: [b]文本[/b] 斜体: [i]文本[/i] 下划线 [u]文本[/u] 插入网上的图片 [img]http://wwww.xxxx.com/img.ext[/img] 插入代码 [code]程序代码[/code]  插入url链接 [url]http://url[/url] / [url=http://url]URL加下滑线[/url] 上传图片 word文档 Txt等附件
内容
  提交时自动拷贝以上内容到剪贴板 Ctrl+V可取出;提问题前先查询标签列表

使用帮助 手机m.jdon.com RSS add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的软件架构社区 推荐FireFox或Chrome快速浏览本站
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-10 jdon.com

anti spam