如何为每个客户管理同一软件的多个版本?

Kri*_*s-I 23 .net svn version-control visualsvn visualsvn-server

我的源代码对所有客户都是95%相同.然而,一些客户要求具体的东西.我如何管理这个,是否可以使用VisualSVN/Subversion?

更新:

关于应用程序的一些细节,它是一个带有NHibernate的Web ASP.NET MVC.

该应用程序有几个项目:Web部件,repo部分(我们使用NHibernate访问数据库)和服务项目.

服务项目使用repo项目,服务项目是具有业务规则的项目.

Chr*_*isF 11

我可以想到两种可行的方法.

第一个涉及为每个客户分支代码.然后,在主线上​​进行的任何编辑都可以在需要时集成到特定客户的分支中.类似地,如果核心产品中的某些东西在分支中被修复,它可以合并回主线,以便随后传播到其他客户的分支.虽然这似乎是最好的方法,但是很难维护和跟踪哪个分支具有哪些编辑功能.

第二种也许是更好的方法涉及重构代码,以便客户特定的代码在一个程序集中 - 每个客户一个.然后,在安装产品时,可以通过使用依赖项注入来配置它.这样,您只有一个代码行,并且分支之间没有合并.虽然它确实依赖于客户特定的代码很容易分离出来.

  • +1用于重构客户特定代码 (4认同)

Mit*_*eat 5

将客户特定代码放在单独的项目/程序集中.战略模式或插件之类的东西可能是最佳选择.

另一个不太吸引人的方式(IMO)将为每个客户创建单独的分支,但这很快就会变得难以维护.


And*_*ndo 5

我们采取的方法是:

  • 在应用程序中插入钩子,允许自定义默认行为(例如,当Save调用一个动作时,内部发生的第一件事就是调用OnSaveHandler).
  • 默认处理程序不执行任何操作,只返回"continueWithNormalExecution".所有处理程序都与原始应用程序(不同的程序集)位于不同的模块中,让我们称之为BehaviourModule
  • 在基于客户端的请求中,我们BehaviourModule通过覆盖默认的"不做任何行为"来修改它.这个修改处理程序的返回码可以是:ContinueNormalExecution,SkipNormalExecution,TerminateExecution,等...
  • 在其他情况下,我们插入基于接口的钩子.在BehaviourModule我们将有更多处理程序实现此接口,例如DoStuffInterface,BehaviourModule使用反射在加载时解析,并且所有处理程序实现DoStuffInterface将在系统中注册.然后在原始应用程序中我们会有类似的东西:如果GetDoStuffInterfaceHandler(handlerID) isnot Nothing那么GetDoStuffInterfaceHandler(handlerID).DoStuff().定义要使用的handlerId是可配置的(可以通过db表,xml文件等).

    我们最终有多个处理程序实现DoStuffInterface不同的ID并在不同的时间调用它们.

通过这种方法,我们有:

  • 具有默认行为的基本应用程序
  • 可配置模块(程序集)自定义应用程序的工作方式

这种方法面临的挑战是找到"甜点" - 客户端可能想要自定义的行为并在那里插入钩子.

希望我在我的描述中很清楚,如果不是......发表评论:)