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

时间:2010-09-02 23:49:36

标签: dependency-injection inversion-of-control static-analysis

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

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

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

使用依赖注入容器时,有没有办法静态地确定所有依赖项都将被解析?

4 个答案:

答案 0 :(得分:5)

Managed Extensibility Framework(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项目的Visual MEFX直观地(在一组程序集上) - 请参阅http://xamlcoder.com/blog/2010/04/10/updated-visual-mefx/

MEF通过非常声明(配置的标准属性)和使用懒惰工作的底层合成模型(它可以构建图形而不创建任何实例)来支持此功能...需要稍微介绍一下。 )

答案 1 :(得分:2)

简答:不,不能这样做。

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

对于一个简单的容器,静态分析可能是可行的,但是这个假设的容器对于真实世界的项目来说是无用的。

与往常一样,这是一种权衡,我们能做的最好的事情是进行一些测试,以便对容器中所有已注册组件的实际解决方案进行操作。 StructureMap有一个AssertConfigurationIsValid()方法就可以做到这一点。

即使如此,也可能会有更多细微的错误,例如lifestyle issues。{/ p>

答案 2 :(得分:1)

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

我在博客上发布了here的测试版。它现在非常有用,而且作为温莎的一切 - 它是可扩展的,所以你可以把你自己的物品放在那个清单上。

alt text

答案 3 :(得分:0)

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

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

如果它编译,则所有依赖项都在那里。

然而,一旦依赖图变得足够大以至于你无法将它完全保留在脑海中(特别是在混合中抛出一些循环依赖),麻烦就会出现。如果你进行涉及重新排列依赖关系的重构,那么调整构造函数调用的顺序将变得很困难。