当前位置:编程学习 > asp >>

架构演进-实例篇

1引言
在标题的取名上,不敢说颇费心机,也算得上花费了一点功夫的。首先想到的是“架构设计过程”,又觉得是不是太大了,因为例子比较局部,不是很完整。叫做“结构变化过程”可能更好点。但是又怕名字取的小气了,进来的人少,参与讨论的就更少了,最终还是取了这个有点忽悠人的标题“架构演进”。
今天的这个架构演进,使用系统中一个局部的实例进行推导和演进,一起来观察一下,架构是如何不满足需求的?架构如何演进?更好的架构应该具备哪些条件?有没有更好的呢?
业务场景

payment1
图1 业务场景图
从上图可以看出,就是一个电子商务网站常见的支付、支付的后续处理,这样一个业务场景。支持多种支付方式,目前包括银联、支付宝,还有平台账户。平台账户就是注册用户将资金存储在平台为用户建立并维护的一个账户里,购买平台的产品,可以使用平台账户中的资金进行支付。
2业务流程
首先用户选择商品。
下单,进行支付。
选择支付方式。
使用相应支付方式进行支付。第三方支付,会跳转到第三方的支付页面进行支付。
平台进行支付的后续处理,包括成功之后的修改状态等,还包括失败之后的记录标记等。
第三方的支付,在打开第三方支付界面的时候,会告诉它一个平台的回调地址,支付之后,通过回调地址接收第三方支付的结果,然后进行后续处理。使用平台账户支付,就直接进行后续处理就可以了。
当然,这其中还会有一些细节,不在我们的讨论范围。例如:使用平台账户进行支付,判断账户金额是否充足。使用第三方支付,是否记录第三方支付的完整过程,以及完整的支付流程。等等具体的业务细节均不在今天的讨论范围。
 
3初级架构-用存储过程搞定它
回调地址接收两个参数,一个是订单编号,一个是标志。标志说明是成功还是失败,或者是更加详细的信息。
CREATE PROCEDURE Proc_PaymentHandle
  @OrderSeqNo VARCHAR(36),  --订单编号
  @ReturnCode VARCHAR(10),  --返回状态码
  @PaymentManner CHAR(1)         --支付方式:1银联,2支付宝,3平台账户
AS
BEGIN
  IF(@PaymentManner='1')
  BEGIN
    --更新订单状态
    --更新银联支付信息
    RETURN;
  END
  ELSE IF(@PaymentManner='2')
  BEGIN
    --更新订单状态
    --更新支付宝支付信息
    RETURN;
  END
  ELSE IF(@PaymentManner='3')
  BEGIN
    --更新定的状态
    --更新平台账户支付信息
    RETURN;
  END
END
配合一段C#代码,判断一下支付方式,然后给存储过程传递参数。这样写的话,上面的这个存储过程很容易就超过1k行了,相信大家也写过1k行以上的存储过程,也维护过这样的存储过程,知道个中的酸甜苦辣。
如果说那一天我们增加了一种支付方式,需要修改的地方包括哪些呢?
界面要修改,存储过程要打开修改,调用的C#代码要修改。真是有点麻烦,最主要的是容易改错了,误改了不应该动的地方才是最要命的。好吧,我们简单分离一下。每种支付方式一个存储过程,把对于支付方式的判断放在代码中,每种支付对应一个代码中的方法。这样需要增加一种的话,只要改改支付方式判断的代码,然后重新写一个存储过程,重新写一个方法调用一下新的存储过程就可以了。可是还有一个问题,更新订单状态好像大家都在做,如果哪一些还需要加一些大家都需要做的事情呢?或者说修改一些大家都需要做的事情的细节?又或者说某两个支付方式需要增加一个处理流程呢?打开存储过程,狂修改吧!!!!
存储过程有几个不便利的地方:
调试不方便
测试不方便
代码不能折叠,多了之后要拖动滚动条才能找得到
逻辑运算、大规模计算是存储过程的弱项
存储过程的优势至少也有一个,就是修改之后,马上可以见到效果。不用编译。
4中级架构-在代码中分离对每种信息的更新
之前的架构代码中有很多的重复地方,例如:对于订单信息的更新。如何把重复降低呢?降低重复也就集中了代码,集中了将来也好维护。而且把它分离出来,独立出来,好像更好点,在需要的地方调用就可以了。如果需要变更订单的更新细节,只要修改一下更新细节就可以了,不需要动支付的代码。减小犯错误的概率。
首先,将各种更新信息独立出来。
 public class OrderRepository3
        {
                public void UpdateState()
                { throw new System.Exception(); }
        }
        public class PlatformAccountRepository3
        {
                public void Update()
                { throw new System.Exception(); }
        }
 
        public class ZhifubaoRepository3
        {
                public void Update()
                { throw new System.Exception(); }
        }
        public class YinlianRepository3
        {
                public void Update()
                { throw new System.Exception(); }
        }
使用下面的方法进行支付的后续处理。
 public class Service2
        {
                public void HandlePaymentResult(PaymentManner2 paymentManner, string orderSeqNo)
                {
                        switch (paymentManner)
                        {
                                case PaymentManner2.PlatformAccount :
                                        var platformService = new PlatformAccountPaymentResultHandleService2();
                                        platformService.Handle(orderSeqNo);
                                        break;
                        &nbs

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,