实例化 class 但声明为接口

Instantiating the class but declared as an interface

假设我有这个界面和存储库

接口:

interface ICustomerRepository
    {

实现接口的仓库

public class CustomerRepository:ICustomerRepository
    {      

在控制器中,我声明了一个接口实例,

private ICustomerRepository repository = null;

谁能解释一下这行的概念?

this.repository = new CustomerRepository();

还在学习中,需要输入。 谁能帮帮我?

在该特定情况下,由于 repositoryICustomerRepository 的占位符,这意味着您将只能访问 ICustomerRepository.

中的所有可用成员

考虑以下因素:

interface ICustomerRepository
{
   void MethodB();

然后你用这个成员实现它:

public class CustomerRepository:ICustomerRepository
{      
   public void MethodA(){...} //Exclusive to CustomerRepository

   public void MethodB(){...} //CustomerRepository implements interface

当您使用 this.repository 时,只有界面中可用的成员可用,例如:

this.repository.MethodB() //this is legal

但不是

this.repository.MethodA() //this is illegal

因为 MethodACustomerRepository 的一部分。

所以你必须考虑是否要隔离你想访问的成员。它只是来自 interface 本身的成员组吗?或者您还想访问 CustomerRepository 的 class 内的其他成员,在某些情况下,这些成员可能还实现多个接口,例如:

CustomerRepository: ICustomerRepository, ICustomerRepository2, ICustomerRepository3等等。

所以为了缩短下面的行只允许您访问在 CustomerRepository 中实现的成员,这些成员在 ICustomerRepository.

的合同中达成一致
//Get only members defined inside `ICustomerRepository`
//This can be properties or methods
this.repository = new CustomerRepository(); 

要验证您在评论中提出的问题,请参阅以下内容:

ICustomerRepository repository = new CustomerRepository();

//Yields true repository is instance of ICustomerRepository
Console.WriteLine(typeof(ICustomerRepository).IsInstanceOfType(repository));

//Yields true repository is instance of CustomerRepository
Console.WriteLine(typeof(CustomerRepository).IsInstanceOfType(repository));

CustomerRepository repository2 = new CustomerRepository();

//Yields true repository2 is instance of ICustomerRepository
Console.WriteLine(typeof(ICustomerRepository).IsInstanceOfType(repository2));

//Yields true repository2 is instance of CustomerRepository
Console.WriteLine(typeof(CustomerRepository).IsInstanceOfType(repository2));

All 产生 true,因此您会看到 repository 的实例是 ICustomerRepositoryCustomerRepository 类型的实例。