如何解决在C#中使用依赖注入时,为什么调用接口方法会自动调用实现的类的方法?
为澄清我的问题,假设我具有以下非常基本的统计信息接口和类:
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
类的实例,并且之所以这样,是因为在其他地方您告诉依赖解析器使用Statistics
每当您提到IStatistics
..
请注意,Statistics.IncrementPacketsDiscovered
的调用与DI本身无关,您可以这样写:
IStatistics x = new Statistics();
x.IncrementPacketsDiscovered();
在外面,x
看起来像IStatistics
。在内部,它是一个Statistics
。如果Statistics执行其他操作(而不只是实现接口),则将更容易看到。如果您还有其他实现IStatistics
的东西(例如您在测试场景中使用的某种FakeStatistics
),那么可能发生的情况也更清楚了-测试是您这样做的有效理由之一在不同的对象套件之间来回切换程序。
您可能只是认为,所有代码之外的某个地方是依赖关系解析程序,它是Microsoft *创建的。它为您完成了上面的第一行代码,后来当您说要使用Reporter
时,它看起来并看到“构造函数接受实现IStatistic
的任何东西的参数,而我只是碰巧在这里有一个Statistics
实例可以满足要求,因此我将其传递给Reporter
构造函数..“,因为它是配置成可以做的/就是它的工作。 / p>
如果您具有用于测试的FakeStatistics,以及用于重新配置注入器以创建和提供伪造对象的上下文,那么它突然开始变得有意义,为什么它是一种有用的工程方法-您不必您说过new Statistics
的100个地方,将其全部更改为说new FakeStatistics
。编写一个类并突然意识到“该类需要统计数据。”您还可以在构造函数中添加单个参数IStatistics x
,然后按 Ctrl 。并选择为其添加属性的选项,该类现在可以访问解析器提供的IStatistics
的适当实现。您不必遍历您所说的new MyXClass(param1,param2)
并将其更改为new MyXClass(param1,param2,someStatistics)
,因为new
处理所有对象的工作是解析程序的职责
通过使用接口并进行编码,以使“实现此接口的任何对象都可以明智地用作此类的输入参数”,然后打开它,以使“类实例查找和提供者服务”可以连接只需通过“在其当前配置的对象包中四处寻找将要完成任务的对象”(然后您根据上下文更改包中的内容)
那你把东西放在包里的什么地方?在配置解析器的程序部分中,诸如AddScoped
,AddTransient
,AddSingleton
之类的方法具有双重目的:将类的类型映射到接口的类型,并配置实例具有的生命周期-解析器为您管理实例,并在您使用的Add *方法指定的生命周期内创建/销毁实例
*当然,通过这个陈述,我对您使用的是哪种注射器进行了粗略的假设。还有其他人为C#提供的其他DI / IoC框架。总体概念保持不变;使计算机能够为您编写代码的次数越多,它越快,越容易且越可靠。在程序中的对象之间建立依赖关系就是在这种情况下,将其交给软件而不是自己编写是很有意义的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。