中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

DDD~領域事件(jian)應(ying)用篇(訂單處理變(bian)得更(geng)清晰)

回到目錄

上一講主要說了領域事件和領域總線,這(zhe)并(bing)不(bu)是一個(ge)很容易(yi)理(li)(li)解的(de)(de)文章,所以(yi)本講(jiang)實例篇主(zhu)(zhu)要是為(wei)了補(bu)充上一講(jiang)的(de)(de)理(li)(li)論知識,本講(jiang)實例關注的(de)(de)是實際(ji)中(zhong)的(de)(de)訂(ding)單(dan)(dan)處理(li)(li)模塊,我們(men)知道(dao),訂(ding)單(dan)(dan)處理(li)(li)是電子商務的(de)(de)核(he)心,往(wang)往(wang)在(zai)這(zhe)里(li)面,會有很多邏輯(ji),在(zai)開(kai)發時,給我們(men)帶來了不(bu)少(shao)的(de)(de)難(nan)度(du),如何(he)更(geng)好(hao)的(de)(de)分離(li)關注點,是本講(jiang)的(de)(de)主(zhu)(zhu)題;本講(jiang)主(zhu)(zhu)要是修改訂(ding)單(dan)(dan)狀態后(hou),為(wei)用(yong)戶發通知為(wei)例,來以(yi)此更(geng)好(hao)的(de)(de)說一下(xia)領(ling)域事(shi)件在(zai)實際(ji)中(zhong)的(de)(de)作用(yong)。

前言(yan) 領域事(shi)件使用的設計(ji)模式是(shi)發布/訂閱模式,或者叫(jiao)觀察者模式。

一 訂單的幾種狀態,在訂單進入到其中一些狀態時,需要通知用戶

  public enum OrderStatus
    {
        /// <summary>
        /// 表示(shi)銷售(shou)訂(ding)單(dan)的已創建狀態 - 表明銷售(shou)訂(ding)單(dan)已被(bei)創建(未用)。
        /// </summary>
        [Description("用戶下單")]
        Created = 0,
        /// <summary>
        /// 訂單被用戶取消(xiao)
        /// </summary>
        [Description("取(qu)消訂單")]
        Canceled,
        /// <summary>
        /// 表示銷售訂單(dan)(dan)的已(yi)(yi)付(fu)款(kuan)狀態 - 表明客戶已(yi)(yi)向銷售訂單(dan)(dan)付(fu)款(kuan)。
        /// </summary>
        [Description("用戶(hu)付款")]
        Paid,
        /// <summary>
        /// 表示銷售訂(ding)單的已發貨狀態(tai)。
        /// </summary>
        [Description("已經發貨(huo)")]
        Dispatched,
        /// <summary>
        /// 訂單已經完(wan)成(cheng)
        /// </summary>
        [Description("訂單完成(cheng)")]
        Finished,

    }

二 為需要通知的狀態,創建領域事件數據源(原來在.net事件里,它一般是EventArgs對象)

    /// <summary>
    /// 訂單已經(jing)確認(ren)事件(jian)源
    /// </summary>
    public class Order_Confirm_Event : Project.Events.EventBase
    {
        public int OrderId { get; set; }
        public string UserName { get; set; }
    }
    /// <summary>
    /// 訂單已經付款事件緣
    /// </summary>
    public class Order_Paid_Event : Project.Events.EventBase
    {
        public int OrderId { get; set; }
        public string UserName { get; set; }
        public decimal TotalPrice { get; set; }
    }
    /// <summary>
    /// 訂單(dan)已經(jing)發貨事(shi)件源
    /// </summary>
    public class Order_Dispatch_Event : Project.Events.EventBase
    {
        public int OrderId { get; set; }
        public string UserName { get; set; }
    }

三 為這些事件源添加事件處理方式

我們一般理(li)解為“行(xing)(xing)為”,一種事件(jian)源(yuan)可(ke)以有(you)多種事件(jian)行(xing)(xing)為,如(ru)一個(ge)訂(ding)單付款事件(jian)源(yuan),它(ta)可(ke)以同時有(you)電子郵件(jian)行(xing)(xing)為和短信行(xing)(xing)為;反之,一個(ge)事件(jian)處理(li)方式也可(ke)以對應多個(ge)事件(jian)源(yuan),如(ru)一個(ge)電子郵件(jian)行(xing)(xing)為,它(ta)可(ke)以同時對應訂(ding)單付款

和訂單(dan)發貨等事件源(yuan),所(suo)以(yi),領域事件在項目中(zhong)是非常靈活的。

    /// <summary>
    /// 發(fa)Email的事(shi)件處理方式
    /// 調用方法:EventBus.Instance.Subscribe<User_Depts_Event>(new SendEmailEventHandler())
    ///      EventBus.Instance.Subscribe<User_Roles_Event>(new SendEmailEventHandler())
    /// </summary>
    public class SendEmail_EventHandler :
       IEventHandler<Order_Confirm_Event>,
        IEventHandler<Order_Dispatch_Event>,
        IEventHandler<Order_Paid_Event>
    {
        static string prefix = "本消息(xi)來自電(dian)子郵件";

        #region IEventHandler<Order_Confirm_Event> 成員

        public void Handle(Order_Confirm_Event evt)
        {
            Logger.Core.LoggerFactory.Instance.Logger_Info(string.Format("尊敬(jing)的客(ke)戶{0},你的訂單(dan)已經確認(ren),訂單(dan)號(hao){1},請(qing)盡快付款!({2})[{3}]"
                , evt.UserName
                , evt.OrderId
                , evt.EventDate
                , prefix));
        }

        #endregion

        #region IEventHandler<Order_Dispatch_Event> 成員

        public void Handle(Order_Dispatch_Event evt)
        {
            Logger.Core.LoggerFactory.Instance.Logger_Info(string.Format("尊敬(jing)的客(ke)戶{0},你的訂單已(yi)經(jing)發貨,訂單號(hao){1},請注意查(cha)收(shou)!({2})[{3}]"
                , evt.UserName
                , evt.OrderId
                , evt.EventDate
                , prefix));

        }

        #endregion

        #region IEventHandler<Order_Paid_Event> 成員

        public void Handle(Order_Paid_Event evt)
        {
            Logger.Core.LoggerFactory.Instance.Logger_Info(string.Format("尊敬的客戶(hu){0},你的訂單(dan)已(yi)經成(cheng)功(gong)付款(kuan),訂單(dan)號(hao){1},付款(kuan)金額為(wei){2}元,我們會(hui)盡快安(an)排發(fa)貨!({3})[{4}]"
                 , evt.UserName
                 , evt.OrderId
                 , evt.TotalPrice
                 , evt.EventDate
                 , prefix));
        }

        #endregion
    }
    /// <summary>
    /// 發(fa)短信的事件處理方式(shi)
    /// </summary>
    public class SendSMS_EventHandler :
         IEventHandler<Order_Confirm_Event>,
         IEventHandler<Order_Dispatch_Event>,
         IEventHandler<Order_Paid_Event>
    {
        static string prefix = "本消息來自(zi)短(duan)信";

        #region IEventHandler<Order_Confirm_Event> 成員

        public void Handle(Order_Confirm_Event evt)
        {
            Logger.Core.LoggerFactory.Instance.Logger_Info(string.Format("尊敬的(de)客戶{0},你的(de)訂單已經確認,訂單號(hao){1},請盡快付款!({2})[{3}]"
                , evt.UserName
                , evt.OrderId
                , evt.EventDate
                , prefix));
        }

        #endregion

        #region IEventHandler<Order_Dispatch_Event> 成員

        public void Handle(Order_Dispatch_Event evt)
        {
            Logger.Core.LoggerFactory.Instance.Logger_Info(string.Format("尊敬(jing)的(de)客戶{0},你的(de)訂(ding)單已(yi)經發貨,訂(ding)單號(hao){1},請注意查收!({2})[{3}]"
                , evt.UserName
                , evt.OrderId
                , evt.EventDate
                , prefix));

        }

        #endregion

        #region IEventHandler<Order_Paid_Event> 成員

        public void Handle(Order_Paid_Event evt)
        {
            Logger.Core.LoggerFactory.Instance.Logger_Info(string.Format("尊(zun)敬的客戶{0},你(ni)的訂(ding)單已經成功付(fu)款,訂(ding)單號(hao){1},付(fu)款金額為(wei){2}元(yuan),我們會盡快安排發(fa)貨(huo)!({3})[{4}]"
                 , evt.UserName
                 , evt.OrderId
                 , evt.TotalPrice
                 , evt.EventDate
                 , prefix));
        }

        #endregion
    }

四 訂閱領域事件

我們需要有(you)(you)一個入口(kou)來訂(ding)(ding)閱領域事件(jian)(jian),如訂(ding)(ding)閱訂(ding)(ding)單(dan)確認事件(jian)(jian),訂(ding)(ding)單(dan)付款事件(jian)(jian)等(deng),簡單(dan)的(de)做法(fa)(fa)是在global里統(tong)一注冊,而標準(zhun)合理的(de)作法(fa)(fa),我覺(jue)得應該在訂(ding)(ding)單(dan)controller的(de)靜態構造(zao)方法(fa)(fa)里去注冊它,因為(wei)只(zhi)有(you)(you)用戶操作訂(ding)(ding)單(dan)相關模塊時,才可能觸

發訂單這些事件!

     /// <summary>
        /// 類的構(gou)造方法,處理與(yu)具體(ti)實例(li)無法的東西
        /// </summary>
        static OrderController()
        {
            #region 訂閱相關領域事件

            #region 訂閱發email處理方式
            EventBus.Instance.Subscribe<Order_Confirm_Event>(new SendEmail_EventHandler());
            EventBus.Instance.Subscribe<Order_Dispatch_Event>(new SendEmail_EventHandler());
            EventBus.Instance.Subscribe<Order_Paid_Event>(new SendEmail_EventHandler());
            #endregion

            #region 訂閱發短信的處理方式
            EventBus.Instance.Subscribe<Order_Confirm_Event>(new SendSMS_EventHandler());
            EventBus.Instance.Subscribe<Order_Dispatch_Event>(new SendSMS_EventHandler());
            EventBus.Instance.Subscribe<Order_Paid_Event>(new SendSMS_EventHandler());
            #endregion

            #endregion
        }

我(wo)們(men)看(kan)到了,每種(zhong)訂單事件(jian)(jian)源都被注冊了電子(zi)郵(you)件(jian)(jian)和(he)短信兩種(zhong)事件(jian)(jian)處理(li)方式,這在對應的(de)事件(jian)(jian)被觸發(發布,publish)之后,它們(men)會被執(zhi)行。

六 觸發具體事件

具(ju)體的事件在具(ju)體的方(fang)法里(li),獨立的去觸發,一般它會(hui)在業務邏輯層完成

     /// <summary>
        /// 用戶下單:create
        /// </summary>
        /// <param name="entity"></param>
        public void DoOrder(Order_Info entity)
        {
            entity.OrderStatus = (int)OrderStatus.Created;
            _orderRepository.Insert(entity);
            entity.Order_Detail.ToList().ForEach(j => j.OrderId = entity.Id);
            _orderDetailRepository.Insert(entity.Order_Detail);
            EventBus.Instance.Publish(new Order_Confirm_Event { OrderId = entity.Id, UserName = entity.UserName });
        }

        /// <summary>
        /// 訂(ding)單付款:paid
        /// </summary>
        /// <param name="entity"></param>
        public void PaidOrder(Order_Info entity)
        {
            entity.OrderStatus = (int)OrderStatus.Paid;
            _orderRepository.Update(entity);
            EventBus.Instance.Publish(new Order_Paid_Event { OrderId = entity.Id, TotalPrice = entity.TotalPrice, UserName = entity.UserName });
        }

        /// <summary>
        /// 訂(ding)單發貨:dispatch
        /// </summary>
        /// <param name="entity"></param>
        public void DispatchOrder(Order_Info entity)
        {
            entity.OrderStatus = (int)OrderStatus.Dispatched;
            _orderRepository.Update(entity);
            EventBus.Instance.Publish(new Order_Dispatch_Event { OrderId = entity.Id, UserName = entity.UserName });
        }

八 最后,我們看一下處理處理頁面和結果(guo)的截圖

生成的日志

生成(cheng)的日(ri)志內容,類(lei)似于用(yong)戶上到的電子(zi)郵(you)件或者短信的內容

怎(zen)么樣,看完這個例子相信您(nin)對領域事(shi)件有(you)了(le)更清晰的(de)認(ren)識了(le)吧,呵呵!

回到目錄

posted @ 2014-11-07 09:17  張占嶺  閱讀(8285)  評論(13)    收藏  舉報