如何通过控制反转来管理依赖项?

时间:2018-12-07 12:40:46

标签: visual-studio dependency-injection msbuild nuget inversion-of-control

我是一个小型软件开发人员,负责构建基于插件的应用程序。每个插件都是其自己的程序集,并引用主程序集,如下所示:

  • 插件1引用nuget包和Application Core.dll
  • 插件2引用nuget包和Application Core.dll

在运行时,主程序集将所有程序集加载到其当前文件夹中,并为插件枚举它们。现在,我所有的项目都构建在同一个文件夹中。我喜欢这样做,因为我可以按F5键在Visual Studio中运行我的解决方案。这也很好,因为如果我不想运行该插件,就可以在解决方案中禁用一个项目。

某些插件现在需要特定版本的nuget软件包。例如:

  • 插件1需要System.Net.Http 4.0.0或更高版本
  • 插件1需要System.Net.Http 4.3.4或更高版本

构建项目时,有时会首先构建插件2,这意味着插件1或2将覆盖4.0.0版本的system.net.http 4.3.4。

对于我来说,避免用旧版本覆盖DLL却又具有我惯用的易于开发的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您可能不喜欢的一种解决方案是停止使用动态加载。如果您的应用程序使用Plugin 1和Plugin 2,则将它们设为NuGet或项目引用,并让构建系统为您找出所有通用软件包的最低版本。您也将不再需要更改所有构建输出路径来获得简单的开发经验。只需使用功能标记/配置来允许客户选择他们想要的功能,而不是添加/删除dll。

另一个选择是将每个插件都具有各自的依赖关系保留在自己的文件夹中,并且主程序将插件加载到不同的App Domain中。这仅适用于.NET Framework,而不适用于.NET Core,但它确实具有使崩溃的插件崩溃整个应用程序的机会较小的优点。该程序可能能够检测到崩溃的插件/应用程序域并卸载它。但是应用程序域几乎就像使用不同的流程一样,并且您存在域间通信问题(所有内容都必须可序列化)