同时维护和部署应用程序的两个版本



我在Visual Studio 2010中有一个C#WinForms应用程序,由两个不同的客户使用。应用程序的基本功能对每个客户来说都是相同的,但不同版本之间的某些代码行(存储过程、资源、某些行为的名称)不同。到目前为止,我已经将应用程序保存在同一个项目中,并在构建/发布时使用预处理器指令来切换要使用的部署。然而,该项目的范围已经扩大到不再可行的地步。

由于有这么多代码是共享的,所以我尽量避免复制源代码文件。我想知道维护一个需要同时部署不同版本的应用程序的最佳方法是什么。

使用接口定义类。拥有一个接口意味着您可以拥有同一接口的多个实现,每个客户端一个。这将要求您分析现有的代码库,并确定代码中可以定义这些接口的逻辑分离。

然后,您就可以根据需要基于客户端加载接口了。例如,您可以通过配置来完成此操作。根据配置值加载Implementation1或Implementation2。有很多方法可以完成这一特定的任务。你应该阅读依赖注入,控制反转,并看看像Ninject,Autofac,Unity这样的工具。

一开始考虑如何使用预处理器指令可能会很困难,但随着应用程序的发展,您需要进行重构。请记住,如果您现在不这样做,那么随着应用程序变得更加复杂,这种重构将在以后变得更加昂贵。

不同的功能应该是应用程序体系结构的一部分。如果您需要为不同的客户提供不同的功能,请将其抽象掉——创建一个封装行为的接口,然后在两个不同的程序集中以两种不同的方式实现它。然后(取决于你的部署机制),你可以用一个DLL或另一个DLL来运送你的应用程序。为了避免重新编译、添加引用等,您可以使用依赖注入框架,如Ninject、Castle Windsor、MEF等。如果代码差异很大,这是一个"类似插件"的架构。

如果你谈论的是文本、颜色、基本差异,它们不应该是硬编码的,而应该是数据驱动的。如果你的应用程序连接了互联网,它可以在用户登录时下载适当的设置。否则,可以在特定于客户的配置文件中放入一些指示文本/颜色/行为的内容。您可以使用配置转换来简化该过程。

您可以通过使用某种资源、配置或属性文件来分离一些差异。我的意思是在文件中存储某种值,例如在特定情况下使用的存储过程的名称。然后,您的代码从文件中读取名称并运行它。您可以更改文件中的值,而无需为每次部署重新生成代码。

最新更新