gpt4 book ai didi

c# - 为什么在使用 Entity Framework 实现存储库模式时使用接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 02:09:59 25 4
gpt4 key购买 nike

在结合 Entity Framework 实现存储库模式时,为什么我看到许多示例使用其存储库类的接口(interface)?一个具体的引用例子是 here .

界面的意义何在?为什么不只是类?是否真的需要不止一个类订阅那个非常具体的接口(interface),例如,仅针对雇员?

最佳答案

这是一种经常使用的模式,通常专门用于单元测试,而不是真正特定于 Entity Framework 、存储库模式,甚至任何数据访问类型。另一个很大的好处是,它使后者有机会在不更改使用它的代码的情况下提供替代实现。
例如,考虑这段代码,它使用 dependency injection图案:

public class EmployeeService
{
private readonly IEmployeeRepository employeeRepository;

public EmployeeService(IEmployeeRepository employeeRepository)
{
this.employeeRepository=employeeRepository;
}

public IEnumerable<Employee> GetAllEmployees()
{
IEnumerable<Employee> employeeList=this.employeeRepository.GetAll();
//Optionally do some processing here
return employeeList;
}
}

通过在存储库中拥有接口(interface),请注意您现在可以完全使用该接口(interface)工作,而无需提及实际的存储库,这就是它的真正值(value)。它主要有两个好处:
  • 如果你想为这个类编写一个自动化的单元测试,你可以给它一个 IEmployeeRepository 的假实现。 ,它不会进入真正的数据库,而是返回一个硬编码列表,这样您就可以测试您的方法,而无需担心数据库。这被称为“模拟”,通常是将接口(interface)放在那里的主要原因。还有一些库可以自动化该过程,所有这些库都依赖于它们生成一个实现接口(interface)的假类这一事实。到目前为止,这是放置这样一个界面的最常见原因。
  • 您可能会决定在 future 的某个时候用其他东西替换 Entity Framework ,或者说,想要将存储库实现到与关系数据库不同的东西。在这种情况下,您将编写另一个存储库,实现完全相同的接口(interface),但做一些完全不同的事情。鉴于使用它的服务只依赖接口(interface)只要遵守相同的契约(Contract),该代码将完全不加修改地工作(当然,实际创建存储库并将其提供给服务的代码必须更改,但这是另一段历史)。这样,无论在何处读取/保存数据,相同的服务都可以正常工作。
  • 关于c# - 为什么在使用 Entity Framework 实现存储库模式时使用接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328906/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com