我正在考虑通过提供一些预定义的接口,将可由“插件”实现并放置在特定位置并被应用程序拾取的可扩展性添加到现有应用程序中。应用程序的核心很少更新,而插件的更新和部署更加频繁。
因此,基本上是这样设置的:
两个项目都是同一构建过程的一部分,核心应用程序会单独部署,而插件则在后期添加。我的问题出在组装版本和随时间解决。假设已部署核心.dll v1且我想添加一个插件。如果plugin.dll引用core.dll v1,则这很好。然而,如果plugin.dll针对更高版本的core.dll进行编译(例如v2),插件无法加载,因为它引用core.dll v2,但已部署的版本仅有core.dll v1。这是合理且预期的行为,但在项目设置方面给我带来了几个问题,即不能通过重新运行生成并添加新插件(现在有较新版本依赖项)来进行插件的开发/更新。我可以看到解决问题的几个选项,但没有一个像我希望的那样简单:向web.config添加绑定重定向,指示所有核心.dll v1+引用解析为core.dll v1引用;创建包含接口定义的“contracts.dll”程序集,并使该特定程序集的版本号在构建之间保持不变;对插件进行部署版的核心.dll编译(以某种方式在开发中引用已部署版本)。如上所述,这些选项都不是我真正期望的低效果方法,希望有人有更巧妙的解决方案?
因此,基本上是这样设置的:
// in core assembly (core.dll)
public interface IReportProvider{
string GenerateReport();
}
// in other assembly(plugin.dll)
public class AwesomeReport : IReportProvider {
string GenerateReport(){ ... }
}
两个项目都是同一构建过程的一部分,核心应用程序会单独部署,而插件则在后期添加。我的问题出在组装版本和随时间解决。假设已部署核心.dll v1且我想添加一个插件。如果plugin.dll引用core.dll v1,则这很好。然而,如果plugin.dll针对更高版本的core.dll进行编译(例如v2),插件无法加载,因为它引用core.dll v2,但已部署的版本仅有core.dll v1。这是合理且预期的行为,但在项目设置方面给我带来了几个问题,即不能通过重新运行生成并添加新插件(现在有较新版本依赖项)来进行插件的开发/更新。我可以看到解决问题的几个选项,但没有一个像我希望的那样简单:向web.config添加绑定重定向,指示所有核心.dll v1+引用解析为core.dll v1引用;创建包含接口定义的“contracts.dll”程序集,并使该特定程序集的版本号在构建之间保持不变;对插件进行部署版的核心.dll编译(以某种方式在开发中引用已部署版本)。如上所述,这些选项都不是我真正期望的低效果方法,希望有人有更巧妙的解决方案?