.NET中的依赖注入和加载依赖程序集

时间:2010-06-24 15:58:24

标签: dependency-injection assemblies dependencies castle-windsor

我正在使用依赖注入(DI从现在开始)来解析组件,并且正在寻找一种在.NET环境中加载依赖程序集的优雅解决方案。作为解释,假设我们有3个组件,A,B和C,其中A依赖于B而B依赖于C.现在我需要从组件A加载组件,但因为我使用DI,我不有一个对程序集A的引用。甚至对程序集A的引用也是不够的,因为我不知何故需要确保A,B和C都在我的输出目录中结束。

因此,一些明显的解决方案是: - 从正在执行的应用程序添加对A,B和C的引用:需要知道依赖结构,在我的情况下,这是非常复杂的,这使得这是一个有点不受欢迎的解决方案。
- 将这些dll添加到GAC:在我的情况下,这不是一个选项。


所以我想知道是否有人对这个问题有一个优雅的解决方案。不确定它是否相关,但我正在使用Castle Windsor进行DI。

感谢
乔尼

3 个答案:

答案 0 :(得分:5)

AppDomain上有一个名为AssemblyResolve的事件,可让您加载丢失的程序集。这使您可以从您提供的任何流中加载缺少的程序集,例如不同文件夹中的文件或存储在数据库中的文件。

答案 1 :(得分:1)

动态加载程序集会给你带来什么?

您应该在执行的应用程序中添加对A,B和C的引用,除非您正在编写旨在由其他方扩展的应用程序,或者您必须非常频繁地更改依赖项。

否则,您通过引入一个不同的问题(在运行时失败的可能性)来解决一个微不足道的问题(需要重新编译以部署更改)。

将引用列表视为应用程序的构造函数参数 - 您的应用程序应该清楚地声明其依赖项,而不是将它们放在配置文件中。

答案 2 :(得分:1)

如果您遇到的唯一问题是在输出目录中获取程序集而不是Windsor问题 - 这是一个MsBuild问题(或者NAnt或者您用来构建项目的任何问题)。让你的脚本做到这一点。

如果您正在查看可扩展性方案,即您在目录中有程序集并且要加载它们,那么Windsor 2.5(当前主干)对此也有一些非常好的支持,无论是来自XML还是来自流利API。