Architecture 管理按顺序开发的相关应用程序的代码库

Architecture 管理按顺序开发的相关应用程序的代码库,architecture,Architecture,我一直在开发一系列具有相关功能的应用程序,每个应用程序都是为不同的客户提供的。这些应用程序有很多共同的功能,但对于每个客户的需求,有些功能是独一无二的,不能提供给任何其他客户 因为到目前为止,属于我们客户的所有版本(A1、B2、A3)都是单独出资开发的,并且在每种情况下都是按顺序开发的,所以我们只需对以前的客户源代码进行快照,然后将其放入新的SVN存储库中,并从那里开始进行更改。到目前为止,我们的管理还不错,但随着未来预期会有更多的客户,我们计划将客户A3的应用程序中的一些改进重新部署到A1的新

我一直在开发一系列具有相关功能的应用程序,每个应用程序都是为不同的客户提供的。这些应用程序有很多共同的功能,但对于每个客户的需求,有些功能是独一无二的,不能提供给任何其他客户

因为到目前为止,属于我们客户的所有版本(A1、B2、A3)都是单独出资开发的,并且在每种情况下都是按顺序开发的,所以我们只需对以前的客户源代码进行快照,然后将其放入新的SVN存储库中,并从那里开始进行更改。到目前为止,我们的管理还不错,但随着未来预期会有更多的客户,我们计划将客户A3的应用程序中的一些改进重新部署到A1的新版本中。我们当前的设置将无法在当前流程中保持可管理性

我在寻找的是关于其他地方是如何做这类事情的信息,以及我们最好的方式是什么。我将描述我对我们如何进行的想法,以及我对此的担忧,并寻求反馈

我们设想我们的客户根据一些高水平的能力差异分为两大类。我用A和B作为客户ID的前缀反映了这一点;A1和A3版本的软件比B2版本有更多的共同点。目前,我们不希望有一个C类被添加,但不能排除几年后改变

我们的基本思想是将功能的公共部分(后端和win form类)拆分为A和B类型客户的公共核心库;然后在单独的解决方案中继承公共类并为每个版本实现特定于客户的功能。我们可能还有一个顶级的公共库,用于与a和B共享的东西,尽管a和B之间有足够多的差异,我担心我们最终会覆盖足够多的方法,从而只会增加情况的复杂性

我认为我需要将每个客户应用程序放在一个单独的解决方案中,而不是只有一个解决方案,并且只选择运行哪个客户应用程序的原因有好几倍:

首先,由于特定于客户的NDA,我们可能会有新的开发人员,他们将不被允许访问以前完成的应用程序,因为如果他们没有被指派处理客户X的应用程序,他们就无法满足外部强加的NDA批准需要了解的要求

第二个原因是,因为我们直接处理特定客户的钱,所以我们不能对公共库功能进行更改(例如,将特定于客户的内容移动到核心或副版本),然后更新每个特定于客户的应用程序以继续使用新的核心。这一约束是我们最初采用独立维护的代码库概念的一个重要原因,并且有可能在合同级别将验证我们划分公共功能和特定于客户的功能的“正确性”作为一项挑战

第三个与第二个相关。出于安全原因,如果客户X不能拥有功能Y,那么即使X的应用程序没有任何方法调用该方法,X的应用程序也不能在公共库中拥有实现Y的方法,因为如果他们足够聪明,他们可以进行反向工程,编写位于公共库之上的自己的前端


编辑:这个问题似乎在这里基本消失了,但我确实得到了相当多的讨论,我没有陷入这种情况,但希望这会有所帮助

我认为你在正确的轨道上保持客户在不同的解决方案;在最初的开发阶段,重复代码可能是额外的工作——但在管理依赖性误入歧途时,您可能会陷入巨大的痛苦,以及必须首先管理它们的开销,这仍然是令人遗憾的

我会记住和:将尽可能多的普通和低级代码分包到库中,这些库不会有太多变化,并且更具公益性(和政治敏感性)的包可以引用这些库

对我来说,提供低级“编码”或系统级服务(保存文件、访问confog等)的“库”代码与纯业务逻辑代码/模块之间有着重要的区别。因此,我认为在这里合理地重复使用是可以接受的

与SAP和SDP一致的还有尽可能多地抽象实现的方法:依赖倒置和策略模式在这里会很有帮助

虽然您所做的不是一个多租户应用程序,但我认为您可能会发现一些常见的问题,并希望找到一些有用的解决方案或方法


我在这里提出的所有建议似乎都是在代码/架构/模式级别上提出的-我知道我在实际代码管理/QA/发布方面没有做过太多的志愿工作-对不起。

我不确定这些建议是否相关;但这些都是C#winform应用程序,需要能够在没有互联网接入的机器上运行。“我在这里提出的所有建议似乎都是在代码/架构/模式层面上提出的——我知道我在实际代码管理/质量保证/发布方面没有做过太多的志愿工作——对不起。”这不是一个问题,所有这些最终都会流到一起。