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
我可以想到两种可行的方法.
第一个涉及为每个客户分支代码.然后,在主线上进行的任何编辑都可以在需要时集成到特定客户的分支中.类似地,如果核心产品中的某些东西在分支中被修复,它可以合并回主线,以便随后传播到其他客户的分支.虽然这似乎是最好的方法,但是很难维护和跟踪哪个分支具有哪些编辑功能.
第二种也许是更好的方法涉及重构代码,以便客户特定的代码在一个程序集中 - 每个客户一个.然后,在安装产品时,可以通过使用依赖项注入来配置它.这样,您只有一个代码行,并且分支之间没有合并.虽然它确实依赖于客户特定的代码很容易分离出来.
我们采取的方法是:
Save
调用一个动作时,内部发生的第一件事就是调用OnSaveHandler
).BehaviourModule
BehaviourModule
通过覆盖默认的"不做任何行为"来修改它.这个修改处理程序的返回码可以是:ContinueNormalExecution
,SkipNormalExecution
,TerminateExecution
,等...在其他情况下,我们插入基于接口的钩子.在BehaviourModule
我们将有更多处理程序实现此接口,例如DoStuffInterface
,BehaviourModule
使用反射在加载时解析,并且所有处理程序实现DoStuffInterface
将在系统中注册.然后在原始应用程序中我们会有类似的东西:如果GetDoStuffInterfaceHandler(handlerID) isnot Nothing
那么GetDoStuffInterfaceHandler(handlerID).DoStuff()
.定义要使用的handlerId是可配置的(可以通过db表,xml文件等).
我们最终有多个处理程序实现DoStuffInterface
不同的ID并在不同的时间调用它们.
通过这种方法,我们有:
这种方法面临的挑战是找到"甜点" - 客户端可能想要自定义的行为并在那里插入钩子.
希望我在我的描述中很清楚,如果不是......发表评论:)