队列框架方案之消息通知解决方案(三)

原创|其它|编辑:郝浩|2009-04-28 10:00:08.000|阅读 603 次

概述:在进行系统设计时,除了对安全、事务等问题给与足够的重视外,性能也是一个不可避免的问题所在,尤其是一个B/S结构的软件系统,必须充分地考虑访问量、数据流量、服务器负荷的问题。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

3.5    处理器重构

3.5.1   重构过程

假设我们把处理每个订单状态[订单生成、订单支付]的程序叫处理器Processor,每个订单状态都有个处理器,比如订单生成、订单支付对应的处理器为OrderCreateProcessor, OrderPaySucceedProcessor,每个处理器都有Process方法,该方法用来生成买家、卖家、客服等发送对象的内容,并调用Process把通知投递出去。通过上述讨论,代码大概如下:

public class OrderCreateMsgProcessor

{

    public void Process()

    {

        //TODO:Poster

    }

    private SenderInfo ConsumerEditor()

    {

        //TODO:构造买家SenderInfo

    }

    private SenderInfo MerchantEditor()

    {

        //TODO:构造卖家SenderInfo

    }

    private SenderInfo ClientEditor()

    {

        //TODO:构造客服SenderInfo

    }

 

}

OrderPaySucceedProcessor.cs的代码内容和上述代码没有什么区别。我们也应该抽象出一个基类或者接口。因为这里是’is a’的关系,而并非’behave like’的关系,并且抽象出来的目的是为了有共有的功能,而非约定、合同。所以我们选择了抽象类。

IProcessor 抽象类有4个属性 ClientTemplate,MerchantTemplate,ConsumerTemplate代表了客服、商家、买家的内容模板,MsgMessage类型,它保存了从消息队列取的消息条目信息;AddPoster方法向发送器列表里添加了一个发送器,AddSender向发送对象列表里添加了一个SenderInfo[这个SenderInfo是派生类中ConsumerEditor, MerchantEditor, ClientEditor方法构造出来的.],IntialProcessor用来初始化处理器ProcessorIProcessor完整的代码如下:

public abstract class IProcessor

{

    private System.Messaging.Message msg;

    #region templates variables

    //Processor通过模板生成不同发送对象的内容

    private string _consumertemplate;//买家模板

    private string _merchanttemplate;//卖家模板

    private string _clienttemplate;//客服模板

    #endregion

    private List<SenderInfo> senderlist = 
new List<SenderInfo>();//
发送对象列表

    private List<ImsgPoster> posterlist = 
new List<ImsgPoster>();//
发送器列表

    #region template properties

    public string ClientTemplate

    {

        get { return _clienttemplate; }

        set { _clienttemplate = value; }

    }

    public string MerchantTemplate

    {

        get { return _merchanttemplate; }

        set { _merchanttemplate = value; }

    }

    public string ConsumerTemplate

    {

        get { return _consumertemplate; }

        set { _consumertemplate = value; }

    }

    #endregion

 

    /// <summary>

    /// 初始化Poster[发送器]Template[模板文件]

    /// </summary>

    protected void InitialProcessor()

    {

        NotifySection section = (NotifySection)
System.Configuration.ConfigurationManager.GetSection("Notify");

        //获取消息类型

        string msgType = String.Empty;

        msgType = ((MessageBase)msg.Body).
MessageType.ToString();

        //获取发送器列表,以逗号隔开!

        string poster = section.MsgTypes[msgType].
Poster.ToString();

        string[] posters = poster.Split(new char[] { ',' });

        foreach (string pst in posters)

        {

            AddPoster(DataAccess.CreateMsgPoster(pst));

        }

        _merchanttemplate = section.MsgTypes[msgType].
Parameters["Merchant"].ParamValue.ToString();

        _consumertemplate = section.MsgTypes[msgType].
Parameters["Consumer"].ParamValue.ToString();

        _clienttemplate = section.MsgTypes[msgType].
Parameters["Client"].ParamValue.ToString();

 

    }

    /// <summary>

    /// 消息

    /// </summary>

    public System.Messaging.Message Msg

    {

        get { return msg; }

        set { msg = value; }

    }

    /// <summary>

    /// 添加SenderInfo(发送对象)

    /// </summary>

    /// <param name="sender">发送对象</param>

    protected void AddSender(SenderInfo sender)

    {

        senderlist.Add(sender);

    }

 

    /// <summary>

    /// 添加发送器

    /// </summary>

    /// <param name="poster">发送器:Email,Msn,Qq,Yahoo,Sms</param>

    public void AddPoster(ImsgPoster poster)

    {

        posterlist.Add(poster);

    }

 

    /// <summary>

    /// 这个是最关键的地方,用virutal实现多态,
从而减少发送器和发送对象的耦合性
!~..~

    /// </summary>

    public virtual void Process()

    {

        if (senderlist != null)

        {

            for (int i = 0; i < senderlist.Count; i++)

            {

                //senderlist[i];

                foreach (ImsgPoster poster in posterlist)

                {

                    poster.post(senderlist[i]);

                }

            }

        }

    }

 

}

现在OrderCreateMsgProcessor类代码如下:

public class OrderCreateMsgProcessor : IProcessor

{

    private SenderInfo ECConsumerEditor()

    {   }

    private SenderInfo MerchantEditor()

    {   }

    private SenderInfo ClientEditor()

    {}

    /// <summary>

    /// 实现父类的Process 方法。

    /// </summary>

    public override void Process()

    {

        //initial processor

        base.InitialProcessor();

       

        //添加买家到链表中~。。~

        SenderInfo sender;

        sender = ECConsumerEditor();

        if (sender != null)

        {

            base.AddSender(sender);

        }

        //添加商家到链表中·。。

        sender = MerchantEditor();

        if (sender != null)

        {

            base.AddSender(sender);

        }

        //添加客服到链表中~。。~

        sender = ClientEditor();

        if (sender != null)

        {

            base.AddSender(sender);

        }

        //邮递员发送到各个地方!

        base.Process();

    }

 

}

IProcessorInitialProcessor里有个NotifySection对象,这个对象将在3.3的配置节点重构章节里说明。

3.5.2   UML

 

 

 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP