Orchard IRepository 与 Linq SQL
Orchard IRepository vs. Linq to SQL
在 Orchard CMS 中使用 IRepository<>
很常见。
所以我问自己,使用IRepository<>
及其Fetch()
方法而不是简单地使用Linq to SQL
来查询数据有什么好处?
IRepository<>
Repository.Fetch(r => r.ID == 1234).Select(r => r.Name)
这里的缺点是我必须在构造函数中注入存储库。
链接到 SQL
from r in Repository where r.ID == 1234 select r.Name
通常,存储库是数据访问代码之上的抽象。您可能有多个 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.
这里当你 运行 你的单元测试时,它不会命中数据库,而是 return dummyCustomer
在 Orchard 的上下文中,您通常不应使用任何一个。存储库是一个几乎不应该使用的实现细节(参见 https://weblogs.asp.net/bleroy/just-forget-that-repository-t-exists-please)。 Linq to SQL 是废弃的 ORM 技术,它从未成为 Orchard 的一部分。 Orchard 使用 nHibernate,最好的办法是直接使用 nHibernate Session 进行低级数据库访问,并使用 Content Manager API 进行更高级别的查询。
我同意 Bertrand 的观点,您应该始终将 IContentManager 用于数据库内容,但我能想到的唯一一种使用 IRepository<> 而不是 IContentManager 的用法是仅用于基于记录的项目,即没有记录的记录部分,在这种情况下,对它们执行数据库操作的唯一方法是通过 IRepository
在 Orchard CMS 中使用 IRepository<>
很常见。
所以我问自己,使用IRepository<>
及其Fetch()
方法而不是简单地使用Linq to SQL
来查询数据有什么好处?
IRepository<>
Repository.Fetch(r => r.ID == 1234).Select(r => r.Name)
这里的缺点是我必须在构造函数中注入存储库。
链接到 SQL
from r in Repository where r.ID == 1234 select r.Name
通常,存储库是数据访问代码之上的抽象。您可能有多个 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.
这里当你 运行 你的单元测试时,它不会命中数据库,而是 return dummyCustomer
在 Orchard 的上下文中,您通常不应使用任何一个。存储库是一个几乎不应该使用的实现细节(参见 https://weblogs.asp.net/bleroy/just-forget-that-repository-t-exists-please)。 Linq to SQL 是废弃的 ORM 技术,它从未成为 Orchard 的一部分。 Orchard 使用 nHibernate,最好的办法是直接使用 nHibernate Session 进行低级数据库访问,并使用 Content Manager API 进行更高级别的查询。
我同意 Bertrand 的观点,您应该始终将 IContentManager 用于数据库内容,但我能想到的唯一一种使用 IRepository<> 而不是 IContentManager 的用法是仅用于基于记录的项目,即没有记录的记录部分,在这种情况下,对它们执行数据库操作的唯一方法是通过 IRepository