【问题标题】:Deploying assemblies to the bin folder without adding references to the project将程序集部署到 bin 文件夹而不添加对项目的引用
【发布时间】:2012-03-23 00:15:45
【问题描述】:

我在我的应用程序中大量使用依赖注入。因此,我的组件引用接口,具体实现只有我的 IoC 容器知道,通过 XML 文件配置。

这种设计的结果是我最终需要我的 bin 文件夹中的程序集(例如 Newtonsoft.Json、SqlLite),而我不需要在我的项目中引用这些程序集。事实上,我明确不想要引用,因为我或我的团队可能会不小心引用具体的实现而不是接口,从而破坏了我们正在使用的 DI 的优势。

VS 2010 SP1 中引入的 _bin_DeployableAssemblies 文件夹对这种情况很有用,但仅适用于 web projects(我个人使用 MVC3 并且可以,但它不能解决一般问题。但是,它似乎或多或少deprecated in VS11 BetaCopying the files into the bin directory prior to build 感觉很恶心 - bin 文件夹不再是构建工件的容器。我想可以使用自定义的构建后事件,但似乎应该有更多的东西盒子”来解决这个问题。我是否坚持使用后期构建?还有什么其他方法可以解决这个问题?

【问题讨论】:

  • 您正在寻找一个因不包括依赖关系而受到伤害的世界。如果您想引用抽象类型,请执行此操作。您可以使用 nDepend 等静态分析工具强制执行此操作。
  • @Oded,你说的伤害世界是什么。这怎么会导致问题?
  • @LandonPoch - 主要是部署问题,尽管在没有对具体类的引用时配置 IoC 容器的后勤工作也会浮现在脑海中(特别是如果您想要强类型配置)。我已经看到上述方法在部署时崩溃了,因为 IoC 容器找不到配置的具体依赖项(未在 anywhere 引用,因此未部署)。
  • @Oded,我使用了在应用程序启动时动态加载的 Ninject 模块,只要 DLL 在 bin 中,它就不会给我带来无法找到具体类型的问题。我喜欢省略引用,因为它有助于强制解耦,尤其是当您的团队中有初级开发人员时。
  • “只要 DLL 在 bin 中”——这是关键。至于 - “如果你的团队中有初级开发人员” - 你教他们而不是使用技术工具来避免教他们。

标签: .net build


【解决方案1】:

有几种方法可以解决这个问题:

  1. 将文件复制到 bin 文件夹的构建后事件将处理此问题。
  2. 将文件作为内容项包含在项目中,但不作为参考。可以将它们设置为在构建时复制到输出文件夹。

我有时会使用第二个选项。这样做的好处是让开发人员可以清楚地看到“依赖关系”,同时仍然阻止他们实际使用程序集中定义的类型,因为它们不是引用,编译器不会认为它们是可用的。

【讨论】:

  • 第二个选项不是根据相对于源文件的路径复制到bin文件夹吗?换句话说,要直接在 bin 中获取它们,我不必将这些东西推到根应用程序目录而不是 ~/lib 文件夹中吗?
  • @EmilLerch 是的,差不多 - 但是,我只是将我的 DI 配置为在 ./lib 文件夹中查找它们,因为如果你将它们放在项目中的 Lib 文件夹...
  • 工作得很好。我添加了 元素 (msdn.microsoft.com/en-us/library/823z9h8w.aspx),框架在正确的文件夹中查找
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多