最近,我正在重构我的DDD项目。当我查看我的存储库层时。我发现它返回IQueryable< T>在我的存储库中。我很困惑,我应该退回IQueryable< T>从存储库层中的DDD项目中的存储库?我通常在我的Repository设计中返回IQueryable类型。但今天我发现了一个相反的想法article 我无法解决这个问题!
答案 0 :(得分:5)
如果您返回FixedJoint
,则允许从域层泄漏到消费者层的域知识。它会增加Domain对象变得贫血的风险,并且所有行为都会移动到其他层。
虽然它能够很方便地返回IQueryable
并且您认为您的代码变得更简单,但这只是一种幻觉;当项目增长时,IQueryable
会将您的代码转换为泥泞的大球,域代码分散在每个地方。您将无法优化存储库或更改一个持久性与另一个(即从sql到nosql)。
答案 1 :(得分:1)
你可能不应该这样做。
存储库的工作不仅要抽象出持久性细节,还要提供一个explicit query contract来定义处理域中命令 1 所需的那些。< / p>
如果您觉得需要进一步过滤/转换从您的存储库返回的内容,那么您很可能无法捕获应该成为存储库合同一部分的显式查询。
拥有此类合同可以让查询客户表达他们的意图并允许更容易的优化。
1。如今,应用一些CQRS原则并将域模型完全用于查询是很常见的。在这种情况下,将通过存储库的唯一查询是处理命令所需的查询。但是,您不会以任何方式使用此方法,因此如果您愿意,您的存储库也可以完成报告查询。