代码之家  ›  专栏  ›  技术社区  ›  Merlyn Morgan-Graham

使用依赖项注入容器时静态确定缺少的依赖项

  •  1
  • Merlyn Morgan-Graham  · 技术社区  · 14 年前

    使用依赖项注入容器时,执行解析时会检测到缺少的依赖项。这是在运行时。

    本文描述了部分解决方案。它将有助于简化测试、调试和维护,但它仍然需要执行测试来验证您的行为(特别是如果使用抽象工厂子解决方案进行运行时解析的话):

    http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx

    当使用依赖注入容器时,有没有一种方法可以静态地确定所有依赖项都将得到解决?

    4 回复  |  直到 13 年前
        1
  •  2
  •   Mauricio Scheffer    14 年前

    简短的回答:不,不可能。

    这样做需要能够将所有组件及其依赖项(容器元数据)表示为一个图,以便对其进行分析。问题是,容器越复杂,就越难实现这一点。以温莎为例。它的 numerous extension points 使依赖关系过于动态,无法用图形表示。懒惰的组件加载程序、处理程序选择器、工厂、组件模型贡献者、子资源管理器都参与到流程中,它们可以是任意的用户代码,这使得静态分析变得不可能。

    静态分析对于一个小容器来说可能是可行的,但是这个假设的容器对于现实项目来说是非常无用的。

    因此,和往常一样,这是一个权衡,我们能做的最好的是进行一些测试,测试容器中所有注册组件的实际分辨率。structureMap有一个assertConfigurationInvalid()方法来执行此操作。

    即使如此,也可能会有更多未被发现的细微错误,例如 lifestyle issues .

        2
  •  5
  •   Sridhar Iyer    13 年前

    托管扩展性框架(MEF)可以做到这一点。为了使分析准确,您需要遵循一些最佳实践,但是结果是好的。

    要分析一组程序集,使用命令行工具-请参见 http://blogs.msdn.com/b/nblumhardt/archive/2009/08/28/analyze-mef-assemblies-from-the-command-line.aspx . 这可以从Visual Studio或持续集成服务器中的生成脚本运行- http://blogs.msdn.com/b/nblumhardt/archive/2009/09/24/debug-composition-from-within-visual-studio.aspx .

    您可以使用Mefcontrib项目的VisualMefx进行可视化(在一组程序集上再次)操作-请参见 http://xamlcoder.com/blog/2010/04/10/updated-visual-mefx/

    MEF通过非常声明性(配置的标准属性)和使用一个工作懒散的底层组合模型(它可以在不创建任何实例的情况下构建图)来支持此功能…把你的头围起来。)

        3
  •  1
  •   Krzysztof Kozmic    14 年前

    除了Mauricio所说的以外,windsor 2.5还有一个功能,在诊断缺少依赖项的问题或只是查看容器中的组件时,您可能会发现这一功能很有用。

    我在博客上写了它的beta版本 here.>它现在非常有用,而且作为温莎的所有东西,它是可扩展的,因此您可以在该列表上列出自己的项目。

    当诊断缺少依赖项的问题或只是查看容器中的组件时,您可能会发现这一点很有用。

    我在博客上写了它的测试版 here . 现在它非常有用,就像温莎的所有东西一样——它是可扩展的,所以你可以在列表上列出你自己的项目。

    alt text

        4
  •  0
  •   Wim Coenen    14 年前

    可能没有依赖注入容器。但是,您可以手动执行依赖项注入,而不需要容器。例如:

    var foo = new Foo();
    var bar = new Bar(foo);
    var program = new Program(bar);
    program.Run();
    

    如果它编译,那么所有依赖项都存在。

    然而,当依赖关系图变得足够大,以至于您无法完全将其保持在您的头脑中时(尤其是在混合中抛出一些循环依赖关系时),麻烦就会出现。如果重构涉及重新排列依赖项,那么调整构造函数调用的顺序将变得非常困难。