为什么在使用实体框架实现存储库模式时使用接口?

时间:2013-10-11 23:49:27

标签: c# entity-framework repository-pattern

在实现存储库模式时,结合实体框架,为什么我会看到许多使用接口为其存储库类的示例?参考的具体示例是here

界面有什么意义?为什么不只是上课?例如,对于员工而言,是否真的需要多个订阅该特定界面的类?

1 个答案:

答案 0 :(得分:5)

这是一种经常使用的模式,通常专门用于单元测试,并非真正特定于实体框架,存储库模式,甚至任何数据访问类型。另一个很大的好处是,它为后者提供了提供替代实现的机会,而无需使用它来更改代码。 例如,考虑使用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;
    }
}

通过在存储库中创建接口,请注意您现在可以完全使用该接口,而不必提及实际的存储库,这是它的真正价值。它主要有两个好处:

  • 如果你想为这个类编写一个自动单元测试,你可以给它一个假的IEmployeeRepository实现,它不会转到真正的数据库,而是返回一个硬编码列表,这样你就可以了可以测试你的方法,而不用担心现在的数据库。这称为“模拟”,通常是将接口放在那里的主要原因。还有一些库可以自动化该过程,所有这些库都依赖于它们生成实现接口的假类的事实。到目前为止,这是建立这样的界面的最常见原因。
  • 您可能决定将来某个时候想要用其他东西替换实体框架,或者说,想要将存储库实现为与关系数据库不同的东西。在这种情况下,您将编写另一个存储库,实现完全相同的接口,但执行完全不同的操作。鉴于使用它的服务<​​strong>仅依赖于接口,只要遵守相同的合同(当然,实际创建回购的代码),代码将完全不受修改 并赋予服务必须改变,但这是另一个历史)。这样,无论在何处读取/保存数据,相同的服务都可以正常工作。