Simple Injector:自动构造函数注入递归

时间:2014-05-14 08:55:53

标签: c# .net dependency-injection ioc-container simple-injector

我试图了解如何在SimpleInjector.NET中完成自动构造函数注入。我的工作源代码来自Code Project文章(v1.5.0.12199)。

我查看了Container的GetInstance)()代码以及InstanceProducer的GetInstance()代码,但我没有看到任何递归调用。

有人可以指出自动构造函数注入的递归发生在哪里吗?

1 个答案:

答案 0 :(得分:1)

从版本v1.5到当前的v2.5框架,容器发生了很多变化。在旧版本中我无法完成的事情如何回忆,但这是当前v2.5版本中发生的事情(当然,事情可能会在未来发生变化,因为它们是实现细节)。

如果您想查看发生这种情况的方法,您需要转到BuildConstructorParameters类的私有Registration方法(请再次注意,我正在讨论v2。这里有5个源代码)。此方法调用Type.GetParameters并迭代它们,并为配置的IConstructorInjectionBehavior类型询问参数的表达式。 DefaultConstructorInjectionBehavior会调用Container.GetRegistration来获取该参数的正确InstanceProducer并关闭循环。

所以完整的堆栈跟踪将是这样的(按自上而下的顺序):

  • Container.GetInstance
  • InstanceProducer.GetInstance
  • InstanceProducer.BuildInstanceCreator
  • InstanceProducer.BuildExpressionInternal
  • Registration.BuildExpression
  • Registration.BuildTransientExpression
  • Registration.BuildNewExpression
  • Registration.BuildConstructorParameters
  • Registration.BuildParameterExpressionFor
  • DefaultConstructorInjectionBehavior.BuildParameterExpression
  • InstanceProducer.BuildExpression
  • InstanceProducer.BuildExpressionInternal< - recursion starts here
  • Registration.BuildExpression