Visual studio 如何使用控制反转管理依赖关系?

Visual studio 如何使用控制反转管理依赖关系?,visual-studio,dependency-injection,msbuild,nuget,inversion-of-control,Visual Studio,Dependency Injection,Msbuild,Nuget,Inversion Of Control,我是一名小型软件开发人员,开发基于插件的应用程序。每个插件都是自己的程序集,并引用主程序集,如下所示: 插件1引用了nuget软件包和Application Core.dll 插件2引用了nuget软件包和Application Core.dll 在运行时,主程序集加载其当前文件夹中的所有程序集,并为插件枚举它们。现在,我的所有项目都构建到同一个文件夹中。我喜欢这样做,因为我可以在VisualStudio中按F5来运行我的解决方案。这也很好,因为如果我不想运行插件,我可以在解决方案中禁用一个

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

  • 插件1引用了nuget软件包和Application Core.dll
  • 插件2引用了nuget软件包和Application Core.dll
在运行时,主程序集加载其当前文件夹中的所有程序集,并为插件枚举它们。现在,我的所有项目都构建到同一个文件夹中。我喜欢这样做,因为我可以在VisualStudio中按F5来运行我的解决方案。这也很好,因为如果我不想运行插件,我可以在解决方案中禁用一个项目

一些插件现在需要特定版本的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和插件2,请将它们设置为NuGet或project引用,并让构建系统为您确定所有常用软件包的最低版本。您也不再需要更改所有构建输出路径来获得轻松的开发体验。只需使用功能标志/配置即可让客户选择他们想要的功能,而不是添加/删除DLL


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

一个解决方案,您可能不喜欢,就是停止使用动态加载。如果您的应用程序使用插件1和插件2,请将它们设置为NuGet或project引用,并让构建系统为您确定所有常用软件包的最低版本。您也不再需要更改所有构建输出路径来获得轻松的开发体验。只需使用功能标志/配置即可让客户选择他们想要的功能,而不是添加/删除DLL


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

谢谢您的建议!我最后做的是制作一个文件复制脚本,检查版本号和写入时间,以确定是否应该复制文件。每个项目都从共享的.targets文件.nice解决方案中引用此脚本。您可能已经知道了,但是如果不同的插件使用不兼容版本的软件包(例如,一些常见的软件包有一个破坏性的更改),这仍然会有问题。复制最新版本的dll解决方案将导致运行时失败。如果您的nuget引用是PackageReference,而不是pacakges.config,则可以将依赖项版本放在.props文件中,从所有CSPROJ中包含它,并在所有PackageReference中使用属性值。您不能再使用Visual Studio进行更新,但它将确保所有项目使用相同版本的所有软件包。感谢您的建议!我最后做的是制作一个文件复制脚本,检查版本号和写入时间,以确定是否应该复制文件。每个项目都从共享的.targets文件.nice解决方案中引用此脚本。您可能已经知道了,但是如果不同的插件使用不兼容版本的软件包(例如,一些常见的软件包有一个破坏性的更改),这仍然会有问题。复制最新版本的dll解决方案将导致运行时失败。如果您的nuget引用是PackageReference,而不是pacakges.config,则可以将依赖项版本放在.props文件中,从所有CSPROJ中包含它,并在所有PackageReference中使用属性值。您不能再使用Visual Studio进行更新,但它将确保所有项目使用相同版本的所有软件包。