这些构造函数参数在控制实例化的这种反转中来自何处?

时间:2018-02-07 13:40:37

标签: c# constructor inversion-of-control resolve

我正在WPF / C#中处理一个不完整的应用程序。其中大部分都编码得很好,虽然我事先并不知道控制反转它让我困惑了一段时间。现在我想我已经弄清楚了一些,但有些事情仍然让我感到困惑。

例证:我们有一个名为CoreApplication的伟大的大班,管理一般的一切。除此之外,它还有一系列RegisterType指令,其中包括

SharedObjects.InversionOfControl.RegisterType<IGoodClass, GoodClass>();

SharedObjects是一个静态类,除其他外,定义了一个名为IUnityContainer的静态InversionOfControl对象,在声明时用新的UnityContainer()初始化。)

CoreApplication的其他地方,有一个ICommand,其中包含代码

var goodClassForNavigation = (SharedObjects.InversionOfControl.Resolve<IGoodClass>()); 

我理解,调用GoodClass的构造函数,因为Register()已关联IGoodClassGoodClassResolve()IGoodClass调用。

精细。现在,转到GoodClass来了解它的作用,我看到它的构造函数如下所示:

public GoodClass(CoreApplication coreApplication)
{
    this.coreApplication = coreApplication;
    // Other stuff happens
}

我已确保参数已正确实例化;它的各种属性和领域都有我期望的价值。

我无法理解的是,这个CoreApplication参数来自哪里?

我试图在GoodClass的基类中查找构造函数,但它们没有明确的构造函数。

感谢那些到目前为止依然和我在一起的人。怎么了?构造函数从哪里获取参数?它是从类中调用构造函数的吗?来自SharedObjects.InversionOfControl的内容?

1 个答案:

答案 0 :(得分:0)

简单地把你的DI框架搞砸了:

  1. 你调用Resolve(),一种DI框架的方法
  2. DI框架现在将IGoodClass解析为GoodClass
  3. DI框架分析构造函数并看到需要一个参数
  4. DI famework现在尝试根据参数类型解析参数实例,在您的情况下CoreApplication
  5. DI框架创建CoreApplication
  6. 的实例
  7. DI框架现在可以通过将已解析的GoodClass实例传递给构造函数
  8. 来创建CoreApplication的实例

    可以配置解析过程,例如使用按惯例注册

    我建议你阅读文章Dependency Injection with Unity