【发布时间】:2018-07-17 19:59:20
【问题描述】:
我正在 WPF/C# 中处理一个不完整的应用程序。其中大部分代码都很好,尽管我事先并不知道控制反转,这让我困惑了一段时间。现在我想我已经弄清楚了一些,但有些事情仍然困扰着我。
举个例子:我们有一个名为CoreApplication 的大类,它管理所有通用的东西。除此之外,它还有一系列RegisterType指令,其中
SharedObjects.InversionOfControl.RegisterType<IGoodClass, GoodClass>();
(SharedObjects 是一个静态类,其中定义了一个名为InversionOfControl 的静态IUnityContainer 对象,在声明时用新的UnityContainer() 初始化。)
在CoreApplication 的其他地方,有一个包含代码的ICommand
var goodClassForNavigation = (SharedObjects.InversionOfControl.Resolve<IGoodClass>());
据我所知,它调用了GoodClass 的构造函数,因为Register() 链接了IGoodClass 和GoodClass,并且Resolve() 是用IGoodClass 调用的。
很好。现在,转到GoodClass 了解它的作用,我看到它的构造函数如下所示:
public GoodClass(CoreApplication coreApplication)
{
this.coreApplication = coreApplication;
// Other stuff happens
}
我已确保参数已正确实例化;它的各种属性和字段具有我期望的值。
我无法理解的是,这个CoreApplication 参数是从哪里来的?
我试图在GoodClass 的基类中查找构造函数,但它们没有明确的构造函数。
感谢至今仍在我身边的人。怎么了?构造函数从哪里获取参数?是来自调用构造函数的类吗?来自SharedObjects.InversionOfControl 中的内容?
【问题讨论】:
-
CoreApplication由您的 DI 框架自动解析,然后将实例传递给构造函数。这在很大程度上取决于您使用的 DI 框架。 -
构造函数需要被...调用。什么东西可以是任何东西......我建议你在构造函数中放置一个断点,并在它命中时检查堆栈跟踪。您应该能够了解它的来源
-
@ViRuSTriNiTy:应用程序使用 UnityContainer。这有帮助还是我误解了您的评论?
-
@musefan:你说的很对,当然。当我这样做时,我看到调用是上面引用的
Resolve<IGoodClass>()行。 -
@Jean-DavidLanz:我想如果您使用的是 Microsoft 框架,它并不像我建议的那样简单......我认为这都是您自己的类
标签: c# constructor inversion-of-control resolve