我了解到,我是C#的新手,使用接口有助于代码灵活应对将来的更改,例如:
这是我的界面:
public interface IEmployeeRepository
{
Employee[] GetAll();
}
然后您可以根据我的喜好实现多种实现
public class EmployeeRepositoryEF: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying your EF DbContext
}
}
public class EmployeeRepositoryXML: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying an XML file
}
}
public class EmployeeRepositoryWCF: IEmployeeRepository
{
public Employee[] GetAll()
{
//here you will return employees after querying some remote WCF service
}
}
现在在我的控制器中:
public class EmployeesController: Controller
{
private readonly IEmployeeRepository _repository;
public EmployeesController(IEmployeeRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
var employees = _repository.GetAll();
return View(employees);
}
}
此GetALL()指的是哪个实现?我在某个地方看到了这个示例,但仍然感到困惑,很抱歉,如果我的问题很愚蠢,但是我今天开始学习它!
答案 0 :(得分:0)
答案是一个问题。您想使用三种可能的实现方式中的哪一种?
您可以使用DI框架将其中的任何一个连接起来。如果您使用的是dotnet core,则可以在Startup.cs中进行以下操作:
services.Register<IEmployeeRepository, EmployeeRepositoryXML>();
然后,无论何时创建控制器,IEmployeeRepository都是XML版本。
答案 1 :(得分:0)
GetAll()
是在接口IEmployeeRepository
中定义的一种方法,因此它无关紧要,可以是它们中的任何一个。这就是为什么我们使用接口。
然而,实际调用的实现是在实例化EmployeesController
时注入的实现。
如果您想知道它将是哪一个,那么请查看项目使用的任何IOC / DI框架的配置。
答案 2 :(得分:0)
你不知道。
这是抽象的全部要点:将实现细节隐藏在通用合同的后面。
在您的情况下,抽象是接口IEmployeeRepository
,合同为Employee[] GetAll()
。该合同承诺将所有员工纳入一个数组,但从 where 和 how 中提取。
EmployeeRepositoryEF
,EmployeeRepositoryXML
,EmployeeRepositoryWCF
是实现细节,您在使用它们时不必直接知道这些细节,因为它们共享相同的合同(它们实现{{1} }。