【问题标题】:Simple Injector: Automatic constructor injection recursionSimple Injector:自动构造函数注入递归
【发布时间】:2014-05-14 08:55:53
【问题描述】:

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

我查看了 Container 的 GetInstance)() 代码和 InstanceProducer 的 GetInstance() 代码,但我在任何地方都没有看到任何递归调用。

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

【问题讨论】:

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


    【解决方案1】:

    容器从 v1.5 版本到当前 v2.5 框架有很多变化。我不记得在旧版本中具体是如何完成的,但这是当前 v2.5 版本中发生的情况(当然将来可能会发生变化,因为它们是实现细节)。

    如果要查看发生这种情况的方法,则需要转到Registration 类的私有BuildConstructorParameters 方法(再次注意,我这里说的是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
    • Registration.BuildExpression

    【讨论】:

    • 感谢史蒂文的回复。 v2.5 似乎比 v1.5 更复杂,但我会尝试单步执行代码;P
    • @TimRobbins:是的,引擎盖下有相当多的复杂性。但所有这些内部复杂性都是为了为用户提供外部简单性。
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多