1
12
我一直在想一个解决类似问题的办法。
可以使用
因此,例如(我在filtercollection中的查询可能有点不对劲,但您应该明白这一点):
不过,这有一个问题:
不幸的是,我不认为有任何方法可以得到你想要的与nhibernate的盒子。如果你想试试的话,你可以假装一下,但他们对我来说似乎是一败涂地: 添加一个方法或属性,该方法或属性在封面下返回一个linq to nhibernate可用于此工具架的IQueryable :
如果有人这样消费:
讨厌!您正在通过您的域模型释放您的持久性需求!也许你可以通过让一个存储库发出iqueryable(在运行时实际上是linq to nhibernate)来减少一点:
还是挺无聊的。 创建您自己的自定义集合类型(可能是一个iqueryable实现),它包装实际图书的私有字段,并将nhibernate映射到该字段 . 但是,使用isession.createfilter可能是一项困难的任务。您必须考虑“发现”当前会话,将linq表达式转换为可以在createfilter中使用的内容,等等。另外,您的业务逻辑仍然依赖于nhibernate。 在这一点上没有什么能真正满足。在nhibernate可以为您对一个集合进行linq之前,您最好像已经建议的那样正常地查询您的图书存储库,即使它看起来没有那么性感或最佳。 |
2
3
我倾向于这样想: 聚合根是一致性的边界,因此如果shelf需要在它包含的图书上强制执行某种一致性策略,那么它应该是聚合根。 在这种情况下,它应该收藏一套书。 如果您不需要以任何方式从书架到书本强制实现一致性,那么我将考虑删除set/collection属性并将这些查询移到存储库中。 另外,由于分页和过滤很可能与您的域逻辑没有任何关系,所以它很可能用于表示。 然后我会考虑为它制作一些特殊的视图,而不是将表示工具添加到我的存储库中。 例如
这种查询可以返回投影和/或作为普通sql等进行优化。 它们很可能是特定于gui中的某个视图或报表的。 这样你的领域将只关注领域概念。 |
3
1
也许你应该给 Nhibernate Linq 尝试一下。它允许您使用IQueryable并执行以下操作:
|
Tony Raimo · 域实体是否应该调用存储库? 7 年前 |
Seb · DDD只读存储库返回“值对象” 7 年前 |
tlt · 使用嵌套对象和大集合进行聚合根优化 7 年前 |
PatrickSJ · DDD,状态对象/值对象 7 年前 |
msmani · DDD更改聚合根id 7 年前 |
DuskMcDusk · 逻辑和性能中的聚合根冲突 7 年前 |