【问题标题】:Maintaining and Deploying Two Versions of an Application Simultaneously同时维护和部署应用程序的两个版本
【发布时间】:2012-11-29 18:52:11
【问题描述】:

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

由于有这么多代码是共享的,我试图避免重复源代码文件。我想知道最好的方法是维护需要同时部署不同版本的应用程序。

【问题讨论】:

  • 不应使用预处理器指令来处理分支。
  • 同意。这最初是一个外部客户表示感兴趣的小型内部应用程序,因此我们需要一个快速的分离解决方案。

标签: c# visual-studio-2010 multiple-versions


【解决方案1】:

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

然后您可以根据需要根据客户端加载界面。例如,您可以通过配置执行此操作。根据配置值加载 Implementation1 或 Implementation2。有很多很多方法可以完成这个特定的位。您应该阅读依赖注入、控制反转并查看 Ninject、Autofac、Unity 等工具。

考虑到您是如何使用预处理器指令的,起初实际上可能很困难,但随着您的应用程序的增长,您将需要进行这种重构。请记住,如果您现在不这样做,那么随着您的应用程序变得更加复杂,这种重构将更加昂贵。

【讨论】:

  • 我预感到这是一个架构问题,感谢您提供的术语(依赖注入、IOC 等)。这些是我在寻找解决方案时缺少的术语。
【解决方案2】:

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

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

【讨论】:

  • 基本的区别已经是数据驱动的了,谢天谢地。它主要是功能。我不熟悉这些框架,但这个应用程序使用 ClickOnce 部署。这会改变这些框架的实施方式吗?
  • 我的项目中也有完全相同的情况。 Ninject,其他 DI 框架也可以,但我们在安装应用程序后从 URL 动态下载 DLL:否则每个客户都会在自己的安装中获得一个包含所有其他客户逻辑的 DLL。它没有太大变化,只是您想从 URL 而不是磁盘加载程序集。或者无论如何你可以从磁盘上做些什么:)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2010-12-17
    • 2013-11-28
    相关资源
    最近更新 更多