2

使用 Linq2Nibernate 时最好让你的 Repository 返回一个 IQueryable?

我的理解是,如果您使用 Linq 来 Nibernate,则查询不会“触发”,直到您调用 .First() 或 Single() 等。那么从所有接口中返回 IQueryable 不是最好的,这样您就可以在表达式树触发之前构建\操作表达式树吗?

我的存储库由服务调用并从 IServicie 继承。

编辑:

首先,我真的很感谢所有的答案。但我想对这个问题补充一点。我赞成这个设计。我不完全理解围绕测试的保留意见。只要在每个过滤点(即每个过滤点)都测试该过程,那么我真的看不出有太大的区别。

添加:

如果您的存储库不返回 IQuerrable,那么使用 Linq2Nibernate 有什么意义吗?

4

3 回答 3

3

个人认为不会。从存储库中公开可组合查询的问题在于,您不能再对它们进行完全单元测试——它们的行为(和成功)现在由调用者摆布。例如,他们可能会这样做.Where(x=>SomeUnmappedMethod(x))(没有翻译)。我在这里添加了更多内容。

如果您有返回(例如)IList<T>或 的固定方法T[],那么您可以确定如果它在单元测试中有效,它应该真正有效(除非有任何配置错误)。这也意味着您可以单独分析 DAL,并对将要执行的 SQL(等)有合理的信心。您无法分析/优化根据调用者更改的 DAL。

(基于我的 LINQ-to-SQL 用法;不是专门的 LINQ-to-NHibernate)

于 2009-03-12T20:05:46.780 回答
1

这取决于什么在消耗您的“存储库”(由于含糊不清而引用)。我会说,如果您的最后一层(UI)之类的东西正在使用您的存储库类而不返回 IQueryable。但是,如果您的 UI 层和数据访问层之间有另一层,我会说是,返回 IQueryable 并让您的中间层处理查询的执行。

编辑

至于测试您的数据访问层(DAL)/存储库,我会说大多数情况下,除非您有实际的逻辑(if 语句等),否则应该几乎没有测试。此时您正在测试框架。我的建议是在您的访问层 (UI) 和 DAL 之间放置另一层,例如 BLL 或处理 IQueryable 查询执行的东西。这样,您的存储库可以返回查询,您的 BLL 可以处理执行它们,并且可能执行一些可以测试的逻辑。

于 2009-03-12T20:10:17.003 回答
0

我不使用 IQueryable,但我会解释为什么我做的有点不同:

  • 更容易模拟存储库,测试使用它的其他代码
  • 集成测试——大多数导致查询被触发的东西都在存储库中,所以我可以针对它做一些真正集中的集成测试
  • 与第一个相关,更容易检查代码是对存储库进行适当的调用。这是因为调用代码会将过滤器信息传递给存储库方法调用,而不是将它们应用于结果。
于 2009-03-12T20:20:25.700 回答