繁体   English   中英

在C#中使用依赖注入时,为什么调用接口方法会自动调用实现类的方法?

[英]When using dependency injection in C#, why does calling an interface method automatically call the implemented class' method?

为了澄清我的问题,假设我有以下非常基本的统计接口和类:

public interface IStatistics
{
   void IncrementPacketsDiscovered();
}

public class Statistics : IStatistics
{
   private int numberOfPacketsDiscovered = 0;

   public void IncrementPacketsDiscovered()
   {
      numberOfPacketsDiscovered++;
   }
}

然后假设我有以下接收注入的 IStatistics 对象的类:

public class Reporter
{
   private IStatistics _statistics;
       
   public Reporter(IStatistics statistics)
   {
      _statistics = statistics;
      _statistics.IncrementPacketsDiscovered();
   }
}

为什么我能够在 IStatistics 对象上调用 IStatistics 方法 IncrementPacketsDiscovered() 并且它自动知道获取在 Statistics 类中实现的方法定义?

任何帮助将不胜感激。 谢谢!

TLDR; 因为实现IStatistics的注入对象是Statistics类的一个实例,这是因为在其他地方你告诉依赖解析器在你提到IStatistics时使用Statistics ..


请注意,调用Statistics.IncrementPacketsDiscovered与 DI 本身无关,您可以这样写:

IStatistics x = new Statistics();
x.IncrementPacketsDiscovered();

在外面, x看起来像一个IStatistics 在里面,它是一个Statistics 如果统计做了别的事情(除了实现接口),它会更容易看到。 如果您有其他实现IStatistics东西,例如您在测试场景中使用的某种FakeStatistics ,那么可能会更清楚发生了什么 - 测试就是一个这样的正当理由,您可以在不同的程序之间来回切换对象套件。

您可以想象,在您的所有代码之外的某个地方是依赖解析器,它是由 Microsoft* 创建的。 它为您完成了上面的第一行代码,后来当您说您想要一个Reporter它查看并看到“构造函数采用任何实现IStatistic的参数,而我恰好在这里有一个Statistics实例这符合该要求,所以我会将其传递给Reporter构造函数......”因为这就是它的配置/这就是它的工作。

如果你有一个用于测试的 FakeStatistics,以及一个你重新配置注入器以创建和提供假对象的上下文,那么它突然开始变得有意义为什么它是一种有用的工程方式 - 你不必有 100 个地方你说的是new Statistics ,你在那里经过并将它们全部更改为new FakeStatistics 编写一个类并突然意识到“这个类需要统计信息......”也很有用,你向构造函数添加了一个参数IStatistics x ,点击Ctrl 并选择为其添加属性的选项,该类现在可以访问由解析器提供的IStatistics的合适实现。 你不必在你说new MyXClass(param1, param2)所有地方追赶并将其更改为new MyXClass(param1, param2, someStatistics)因为new所有对象的工作是解析器的责任

通过使用接口和编码,“实现该接口的任何对象都可以明智地用作此类的输入参数”,然后您将其打开为“类实例查找和提供者服务”可以连接所有应用程序的可能性一起只是通过“在其当前配置的对象包中翻找一个可以完成工作的对象”(然后根据上下文更改包中的内容)

那么你把东西放在包里的什么地方呢? 在您配置解析器的程序部分中,像AddScopedAddTransientAddSingleton这样的方法具有双重目的,将类类型映射到接口类型,并配置实例具有的生命周期类型 - 解析器为您管理实例并在您指定使用的 Add* 方法的生命周期内创建/销毁它们

* 有了这个声明,我当然是对您使用的喷油器做出粗略的假设。 还有其他可用于 C# 的 DI/IoC 框架,由其他人创建。 总体概念保持不变; 让计算机为您编写代码的次数越多,它就会越快、越容易、越可靠。 在程序中的对象之间建立依赖关系是将它交给软件而不是自己编写的一个地方

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM