Orchard IRepository vs. Linq to SQL

本文关键字:to SQL Linq vs IRepository Orchard | 更新日期: 2023-09-27 18:21:32

在果园CMS中,使用IRepository<>非常常见。

所以我问自己,使用IRepository<>及其Fetch()方法而不是简单地使用Linq to SQL来查询数据有什么好处?

I存储<>

Repository.Fetch(r => r.ID == 1234).Select(r => r.Name)

这里的缺点是我必须在构造函数中注入存储库。

Linq到SQL

from r in Repository where r.ID == 1234 select r.Name

Orchard IRepository vs. Linq to SQL

通常,存储库是数据访问代码之上的抽象。您的IRepository接口可能有多个实现,一个使用LINQ to SQL作为数据访问技术,另一个使用Raw ADO.NET,或者另一个则使用XML文件作为数据存储。有了这个存储库抽象,您访问数据的前端代码(例如:repository.GetCustomer(someId))保持不变。我们可以根据需要简单地切换语句。

有了这种抽象,就可以为代码编写单元测试。您只需要创建一个IRepository的模拟实现。您可以使用Moq这样的嘲讽库来实现这一点。

使用Moq的单元测试代码的快速示例

var repo= new Mock<IRepository>();
var dummyCustomer = new Customer { Name ="Test"}
repo.Setup(s=>s.GetCustomer(It.IsAny<int>).Returns();
var customerMgr = new CustomerManager(repo.Object);
var actualResult = customerMgr.GetCustomer(345);
//Assert something now.

在这里,当您运行单元测试时,它不会到达数据库,而是会返回dummyCustomer

我同意Bertrand的观点,即应该始终使用IContentManager处理数据库内容,但我能想到的唯一一种用法是使用IRepository<>IContentManager只用于基于记录的项,即没有部分的记录,在这种情况下,对它们执行数据库操作的唯一方法是通过IRepository

在Orchard的上下文中,通常都不应该使用任何一种。存储库是一个几乎永远不应该使用的实现细节(请参阅https://weblogs.asp.net/bleroy/just-forget-that-repository-t-exists-please)。Linq to SQL是一种被抛弃的ORM技术,它从未成为Orchard的一部分。Orchard使用nHibernate,您最好的选择是直接使用nHibenate会话进行低级数据库访问,并使用Content Manager API进行高级查询。