在不同的类中实现接口签名如何知道要使用哪个

时间:2018-07-17 10:07:14

标签: c# model-view-controller

我了解到,我是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()指的是哪个实现?我在某个地方看到了这个示例,但仍然感到困惑,很抱歉,如果我的问题很愚蠢,但是我今天开始学习它!

3 个答案:

答案 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 中提取。

EmployeeRepositoryEFEmployeeRepositoryXMLEmployeeRepositoryWCF是实现细节,您在使用它们时不必直接知道这些细节,因为它们共享相同的合同(它们实现{{1} }。