我已经花了相当长的时间来寻找典型的 Repository 模式(针对特定查询的方法列表越来越多,等等)所提出的问题的良好解决方案。(见: http://ayende.com/blog/3955/repository-is-the-new-singleton)。
我非常喜欢使用 Command 查询的想法,特别是通过使用规范模式。然而,我的问题在于规范只涉及简单选择的标准(基本上是 where 子句) ,而不涉及查询的其他问题,比如连接、分组、子集选择或投影等。基本上,为了获得正确的数据集,许多查询必须经历所有额外的环。
(注意: 我在 Command 模式中使用术语“ Command”,也称为 query 对象。我不是在讨论命令,而是在命令/查询分离中区分查询和命令(更新、删除、插入)
因此,我正在寻找可以封装整个查询的替代方案,但是仍然足够灵活,以至于您不仅仅是用大量的命令类来交换意大利面条式的存储库。
我曾经使用过,例如 Linqspecs,虽然我发现能够为选择条件分配有意义的名称有一定的价值,但这还不够。也许我正在寻找一个混合的解决方案,结合多种方法。
我正在寻找其他人可能已经开发出来的解决方案,以解决这个问题,或者解决一个不同的问题,但仍然满足这些要求。在链接的文章中,Ayende 建议直接使用 nHibernate 上下文,但我觉得这会使业务层变得很复杂,因为它现在还必须包含查询信息。
只要等待期一过,我就会悬赏这个。因此,请让你的解决方案有价值,与良好的解释,我会选择最好的解决方案,并支持亚军。
注意: 我正在寻找的东西,是 ORM 为基础。不需要明确地使用 EF 或 nHibernate,但它们是最常见的,最适合。如果它可以很容易地适应其他 ORM 的,这将是一个奖金。兼容 Linq 也不错。
更新: 我真的很惊讶,这里没有很多好的建议。看起来人们要么完全是 CQRS 要么完全属于仓库阵营。我的大多数应用程序都不够复杂,不足以支持 CQRS (大多数 CQRS 拥护者很容易说你不应该使用它)。
更新: 这里似乎有点混乱。我不是在寻找一种新的数据访问技术,而是一种设计合理的业务与数据之间的接口。
理想情况下,我要寻找的是 Query 对象、规范模式和存储库之间的某种交叉。如前所述,规范模式只处理 where 子句方面,而不处理查询的其他方面,如连接、子选择等。存储库处理整个查询,但是一段时间后就失控了。查询对象也处理整个查询,但我不想简单地用大量查询对象替换存储库。