【发布时间】:2012-03-23 00:15:45
【问题描述】:
我在我的应用程序中大量使用依赖注入。因此,我的组件引用接口,具体实现只有我的 IoC 容器知道,通过 XML 文件配置。
这种设计的结果是我最终需要我的 bin 文件夹中的程序集(例如 Newtonsoft.Json、SqlLite),而我不需要在我的项目中引用这些程序集。事实上,我明确不想要引用,因为我或我的团队可能会不小心引用具体的实现而不是接口,从而破坏了我们正在使用的 DI 的优势。
VS 2010 SP1 中引入的 _bin_DeployableAssemblies 文件夹对这种情况很有用,但仅适用于 web projects(我个人使用 MVC3 并且可以,但它不能解决一般问题。但是,它似乎或多或少deprecated in VS11 Beta。Copying the files into the bin directory prior to build 感觉很恶心 - bin 文件夹不再是构建工件的容器。我想可以使用自定义的构建后事件,但似乎应该有更多的东西盒子”来解决这个问题。我是否坚持使用后期构建?还有什么其他方法可以解决这个问题?
【问题讨论】:
-
您正在寻找一个因不包括依赖关系而受到伤害的世界。如果您想引用抽象类型,请执行此操作。您可以使用 nDepend 等静态分析工具强制执行此操作。
-
@Oded,你说的伤害世界是什么。这怎么会导致问题?
-
@LandonPoch - 主要是部署问题,尽管在没有对具体类的引用时配置 IoC 容器的后勤工作也会浮现在脑海中(特别是如果您想要强类型配置)。我已经看到上述方法在部署时崩溃了,因为 IoC 容器找不到配置的具体依赖项(未在 anywhere 引用,因此未部署)。
-
@Oded,我使用了在应用程序启动时动态加载的 Ninject 模块,只要 DLL 在 bin 中,它就不会给我带来无法找到具体类型的问题。我喜欢省略引用,因为它有助于强制解耦,尤其是当您的团队中有初级开发人员时。
-
“只要 DLL 在 bin 中”——这是关键。至于 - “如果你的团队中有初级开发人员” - 你教他们而不是使用技术工具来避免教他们。