我正在用.Net开发一个桌面应用程序,它遵循插件架构,如下所示:-
我有一个“核心”.Net解决方案,包含桌面exe项目和少数类库项目。这些类提供各种共享/公共功能,并由应用程序exe和各个模块引用。
每个模块都生活在自己的.Net解决方案中。该解决方案有自己的上述共享库DLL副本,模块的项目(S)引用。
最终用户安装实际上只需要将核心exe &DLL以及该站点所需的模块的DLL部署到一个文件夹中。我对核心exe用来“发现”哪些模块存在的机制没有问题,然后加载并初始化它们。
我关心的是管理和部署DLL。在理想的世界中,我应该能够对“模块X”进行更改,并且只重新部署该模块的DLL。但是,更改也可能涉及更新一个共享库是可行的。当我重新部署这些更新的DLL时,更新的共享库功能可能会破坏引用它的其他模块(甚至应用程序exe)。我想在这个场景中我应该做的是重建/重新部署所有的解决方案,而不仅仅是“模块X”。
一种更简单的方法可能是将“核心”和所有模块看作一个单一的产品,并重新部署每个版本中的所有内容,即使这只是对一个模块的更改。但是我觉得我将失去插件体系结构的一个优点--我应该能够孤立地发布一个新版本的模块。
有什么想法吗?或者这种DLL引用问题是使用插件架构不可避免的一部分?
发布于 2014-11-18 10:30:36
我会采取这样一种方法,即共享库是核心的负责任的,模块可以根据个人的需要进行更新,除非需要对共享库进行更新。
此外,我会跟踪库的版本,方法是为每个版本的核心平台保留一个版本号,并让模块知道它们需要哪个核心版本。这将使跟踪版本不匹配问题变得更简单。
这样做的优点是,模块开发可以在很大程度上独立于核心平台和彼此进行,希望只需要偶尔对核心进行更新。
发布于 2014-11-18 22:41:56
只要您是所有“插件”的唯一供应商,只要独立模块不需要数百MB的磁盘空间,我建议您始终将所有DLL放入每个发布的包中,并将所有内容作为一个产品来处理,只有一个版本号。这使得部署更容易,因为不需要单独的包进行部分更新,而且如果需要完整重新安装最新版本,则可以使用完全相同的包。
但是,如果您要使用您的插件体系结构来让您的模块获得它们自己的生命周期(主要是独立于核心的生命周期),那么规划模块,就像它们是由另一个供应商提供的一样。确保模块和核心之间有一个稳定的接口,并确保模块库不会与核心库发生冲突(例如,避免将它们安装到同一个文件夹中)。即使您有一个在核心中使用的共享库,并在您的一个模块中重用,也要确保核心和模块可以同时使用该共享库的不同版本。并确保您的产品和模块有自己的版本号。然后,您可以分别部署内核和插件。
第二个选项通常会比第一个选项在配置管理方面付出更多的努力,所以仅仅“因为您有一个插件体系结构并且可以将您的模块作为不同的产品来对待”并不意味着您必须这样做,并且在将所有东西部署到一个包中时,您会丢失一些重要的东西。
发布于 2017-03-08 22:12:52
给你三个选择,选一个你更喜欢的:)
https://softwareengineering.stackexchange.com/questions/263113
复制相似问题