.net c/s项目,在有些地方不同的客户有各自不同的业务逻辑,比如某会员到某店使用积分,有的客户只允许本店会员使用,有的允许同城,总之各家有各家的政策,政策还可能有变,政策之下还可能有例外情况,等等,所以我考虑了以下方案,但由于第一次面临这种问题,网上也没搜到满意的解决套路,所以不知道自己瞎想的办法是否是笨办法,想知道是否已经有成熟科学的做法,望指教,先谢过。下面说我的做法:
- 客户端主程序定义ICustomLogic接口,里面定义OnVipUseJiFen(Vip vip)、 OnVipUseXXX(Vip vip)等方法。然后在全局定义一个ICustomLogic CL变量,程序启动后给CL赋值:
CL = (ICustomLogic)CreateInstance(从服务器取得程序集信息);
- 在特定的业务操作处,执行特定逻辑。比如在使用积分的方法中:
private void UseJiFen() {
CL.OnVipUseJiFen(vip);
//go on
}
- 然后为每一个客户创建CustomLogic.XXX项目,XXX为客户标识,有几个客户就有几个这样的项目,这些项目都引用主项目,然后写一个类来实现ICustomLogic接口,并在若干OnXXX方法中写上该客户的逻辑。编译项目,把生成的dll放到客户的服务器上,并在web.config中填上该程序集的信息,然后写个响应页面返回dll和它的信息,客户端在CreateInstance之前先请求该页面,获得dll及程序集信息,然后CreateInstance给CL变量
- 这样每个客户的程序目录中,都有一个属于自己的CustomLogic.xxx.dll类库,里面存放自家独特的业务逻辑,哪家客户政策有变时,只需改动他家的CustomLogic.XXX项目并重新编译dll丢到他的服务器覆盖就行
求更科学的办法,或指出问题,感激不尽!
具体业务具体分析.和什么什么模式的关系不大
再说设计模式的书里都有24种,想要一种方法解决所有问题是不可能.
显然我只问了一种情况,而且描述的够具体,你能答就答,不能答你给我闭嘴,你这ID我见过几次,都是这种装逼无干货的调调,多嘴一句,装逼不会对你的技术水平和人格修养有任何帮助,信我。
@ahdung: 哈哈哈.可以可以..确实有时候看到一些不学习光瞎想的问题我会喷.
但我觉得你这个问题还算正常.我回答的也算正常.我完全不知道你的G点是哪里..
@吴瑞祥: 我还就不觉得你的回答正常,人家好好的问,你就好好的答,答不了或者不耐烦答你就别答,没人会说你怂,勉强答还要装出一副高人语焉不详故弄玄虚的样子,很讨人厌你知道吗。
@ahdung: 其实多说无益.我还是很好奇.我第一个回答怎么就装逼了.
这个才是干货好嘛?难道告诉你的想法是对的?你为每一个客户端建一个项目这种事情还要别人支持?
思路都是错的.就想着让人跟着你错误的思路走?说了一句:你的思路是不可实现的.你就骂?
@吴瑞祥: 如果你本意不是如此,我向你道歉,但我就是从你的话得到的就是这种感受,还有以前见过你的其它回答也是这种感受,至于说是我的感受出问题还是你的表达方式出问题,不评判。另外,你上面说的那些是你臆想的,怼你的原因只有一个,就是认为你强答装逼,你要真拿出干货提出应该怎样怎样不该怎样怎样甩我一脸,我感谢你来不及。最后,不是为每个客户端建一个项目,而是把每个客户的差异部分封装成不同的dll,所以你连问题都没搞清楚。
一楼回答并无不妥的位置,lz没必要这样骂人。
关于问题本身,如果变更不频繁其实也没太大问题,如果说要进一步的话无非就是用现成的ioc框架去取代你的CreateInstance过程。如果要再进一步用静态语言就有点麻烦,因为你的规则在无法预期的变动,而这块很难以去用静态语言来承载这种变化,这块主体办法就是将变化的部分剥离不再使用静态语言描述逻辑:
1.使用xml做dsl,这种很久以前还火过一段时间,大概思路就是用xsd去描述最小的逻辑单元,然后用xml去组织这些逻辑构建成你完整的逻辑,而在c#代码中是根据xsd生成对应的class,分别去实现。
大概就是
<xsd:element name="addJifenStrategy">....
<xsd:element name="addJifen">
<xsd:complexType>
<xsd:element type=addJifenStrategy"/>
...
这种写法实现成本低,在可控的变化范围内可以提供最简单的支持,但一旦变化超过预期或你定义的最小逻辑单元过粗可能就有点吃力。
2.使用dlr,找个支持的语言,比如ironpython,这种你可变的逻辑全部丢python里面,c#代码中只需要执行引擎带入参数后Execute后就能拿结果,这种的好处是灵活度相当高,但缺点是性能低一点,如果出错debug起来比较麻烦。
感谢支招,目前来说,执行自定义逻辑的数量/时机/地方是固定的,只是逻辑各有不同,我想这是属于比较初级的动态逻辑场景,就想知道是不是已经有较为通行的正统做法。另外关于你提到的DLR,想顺便问一下,比较适合让客户IT去写的语言(脚本类、过程化)有没有推荐?
@ahdung: 这块我这边接触的都是内部项目,为了减少开发成本有针对性的做的,这块的确没怎么细研究过有没有什么成熟的解决方案。不过话说回来,我感觉你做的如果是产品化的给客户用的前期不太需要考虑这块的问题,客户可不会管这地方要怎么改,如果要改的话肯定是直接电话过来了,而且碰到那些2b点的自己如果改出问题了搞不好还倒打一耙说是你们产品本身的问题。
@Daniel Cai: 我也一直做的是内部自用项目,现在是因为有个内部项目有推广给同行的可能,所以面临这种问题。总之谢谢分享。
试试动态编译技术吧,实现接口的类的脚本保存在某个位置,然后系统界面和代码是完全分离的。每个客户一套界面一套脚本。
谢谢,倒还没到界面都不一致的地步,就是局部业务逻辑有异而已。一开始就是用的动态编译,分发类源码到客户服务器,然后客户端启动时下载源码动态编译,但由于也不可能让客户自己根据变化去改源码,反正都得我来改,所以感觉多次一举,还不如直接给dll,还能规避客户端复杂环境可能造成的动态编译问题。
博问的和谐圈子需要博客园园友们共同创造!
从心理学角度分析,楼主对一楼的爆发的行为属于
九种常见的性格缺陷之偏执性格缺陷的特征
——心理活动常处于紧张状态,因此表现孤独、不安全感、沮丧、阴沉、不愉快、缺乏幽默感,医学上将这类性格缺陷归属于"社会隔离型"人格。
误诊,我只是因为多次见过一楼的恶心回答,没想他在我楼下也来这套,所以口出恶语,爆发?不存在的。