我目前正在为使用ASP.NET MVC3和C#和Razor开发的Web应用程序重构代码。为了更好地构造应用程序,我使用的一种模式是Repository pattern,它除了是一种非常有用的模式之外,也是开发人员社区中经常讨论的问题。
在这种情况下,我找到了Fredrik Normen的一篇文章,该文章指出,根据存储库的定义,存储库类必须提供实际的实体(例如,.NET中的List),而不是可查询的对象(.NET中的IQueriable)。相反,在ASP.NET MVC官方网站的NerdDinner tutorial中,当存储库必须提供同一对象的多个实例时,它们使用IQueriable;当存储库必须提供对象的单个实例时,它们使用实际实体。
根据存储库模式对存储库类/接口进行建模时,最正确的方法是什么?
谢谢
弗朗切斯科
最佳答案
我认为这类事情不利于您的时间使用。 ;-)
从理论上讲,您的存储库应该返回对象或对象的传统集合,是的。但是,即使您链接到的存储库模式的定义也使用术语“类似集合的接口”。当然,IQueryable<Entity>
是“类似集合”的接口,是吗?
实际上,我几乎从未考虑过区别...但是我总是尝试将所有查询代码放入存储库中。我会说90%的基于集合的存储库方法返回传统集合,而其他10%则返回基于IQueryable<>
的内容。异常通常与分页有关。因此,如果需要,我可以从查询中获取总计,如果不需要,则不必提早获取该信息。有点懒,但是对我有用。
但是我确实认为始终尝试返回传统集合是一个好主意,因为这将意味着您将所有查询封装在应该存在的存储库中。我建议您不要太拘泥于坚持某人对pattern-X的要求的想法