你的位置:首页 > ASP.net教程

[ASP.net教程]Lind.DDD.Events领域事件介绍

回到目录

闲话多说

领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托,哪个是事件,搞的大家是糊里糊涂,进入C#2.0时代后,大叔也买了一本书,对于delegate和event这两个知识点看了至少有20几遍,感觉稍微有点明白了,明白了其中的真谛和用意。

委托:方法的规范,方法的模板,可以代表一类方法的集合

事件:委托的实例,事件在使用之前需要为它赋值,当然赋的就是一个方法;事件可以注册和取消,当你注册一个事件之后,在事件被触发后,被注册的方法将会被执行,这一般被称为“方法的回调”,在设计模式里,又被称为“pub/sub模式”,即发布/订阅模式;在C#语言发展过程中,设计得为程序开发者考虑的很多,有些写法得到了精简,如Action和Func委托的出现之后,我们基本上告别了delegate,这对程序开发人员无疑是一件好事。

大叔框架中的事件

在大叔框架里,事件是常客,比如在早期的仓储代码里,你可以传递一个Action<string>的委托,来进行日志的记录,这种方法在IoC出现后,被大叔屏蔽了,原因不在这里说了,还有就是在N层架构里,WEB层与BLL层进行通讯时,WEB层通过HttpClient请求第三方的API获取数据,而BLL层的方法需要用到这个第三方API的返回值,而在BLL层直接访问HTTP显然是不合适的,所以,在WEB层到BLL层的方法参数设计时,需要有一个委托来接改从WEB层回调的方法返回值,这种代码一般称为“方法回调”。

web层向BLL层传入一个委托

 var entity = rechargeService.RechargeAuto(            task,            beforeTime,            out result,            (studentid, money) =>            {              //代码              });

 

BLL层接改这个委托的返回值,代码在调用bll层这个方法时,首先会回调web层的http的方法

public Task_xuexiba_Recharge RechargeAuto(     Task_Info task,     DateTime beforeTime,     out bool result,     Func<int, decimal, RechargeXuexibaDTO> api)    {      //代码     }

 var apiEntity = api(task.Task_ParametersForXuexibaRecharge.StudentID, task.Task_ParametersForXuexibaRecharge.Money);

Lind.DDD框架里的领域事件

事件源后缀:Event

事件处理方法后缀:EventHandler

领域事件一般出现个领域实体里,在实体被建立时,会订阅和自己有关的事件,每个事件都有一个或者多个事件处理方法,事件处理方法可以进行数据库操作,或者网络和文件的操作,如发通知,写文件等,所以有时候我们的事件需要设计成异步的事件。

程序中的事件事件

  #region 领域模型  public class Order  {    public Order()    {      Lind.DDD.Events.EventBus.Instance.Subscribe(new OrderInsertEventHandler());      Lind.DDD.Events.EventBus.Instance.Subscribe<OrderPaid>(new OrderUpdateEventHandler());    }    public System.Guid Id { get; set; }    public System.Guid UserId { get; set; }    public string UserName { get; set; }    public decimal TotalFee { get; set; }    /// <summary>    /// 用户提交并确认订单    /// </summary>    public void ComfirmOrder()    {      //事件发布      Lind.DDD.Events.EventBus.Instance.Publish(new OrderConfirm      {        TotalFee = TotalFee,        UserName = UserName,        UserId = UserId,      });    }  }  #endregion

下面是领域事件源

  /// <summary>  /// 订单被确认的事件源  /// </summary>  public class OrderConfirm : Lind.DDD.Events.IEvent  {    public override string ToString()    {      return "订单已经确认";    }    /// <summary>    /// 订单总金额    /// </summary>    public decimal TotalFee { get; set; }    /// <summary>    /// 购买者ID    /// </summary>    public Guid UserId { get; set; }    /// <summary>    /// 购买者    /// </summary>    public string UserName { get; set; }    #region IEvent 成员    public Guid AggregateRoot    {      get { throw new NotImplementedException(); }    }    #endregion  }

下面是领域事件的处理程序

   /// <summary>  /// 订单被插入时的处理程序  /// </summary>  public class OrderInsertEventHandler :     Lind.DDD.Events.IEventHandler<Events.OrderConfirm>  {    #region IEventHandler<OrderSigned> 成员    public void Handle(Events.OrderConfirm evt)    {      //处理訂單确认的逻辑      var orderRepository = new Lind.DDD.Repositories.EF.EFRepository<Orders>();      orderRepository.SetDataContext(new testEntities());      orderRepository.Insert(new Orders      {        Id = Guid.NewGuid(),        OrderStatus = 1,        TotalFee = evt.TotalFee,        UserId = evt.UserId,        UserName = evt.UserName,      });    }    #endregion  }

如果希望将自己的事件处理程序设计成异常的,即不阻塞当前线程的,可以让它添加HandlesAsynchronouslyAttribute这个特性,如下面这个发送Email的处理程序就是一个异步的。

  /// <summary>  /// 发邮件功能[某个事件的行为]  /// </summary>  [HandlesAsynchronouslyAttribute]  public class SendEmailEventHandler :    IEventHandler<OrderEvent>,    IEventHandler<UserEvent>  {    #region IEventHandler<OrderEvent> 成员    public void Handle(OrderEvent evt)    {      Console.WriteLine("生成和确认订单{0}时发Email", evt.OrderId);    }    #endregion    #region IEventHandler<UserEvent> 成员    public void Handle(UserEvent evt)    {      Console.WriteLine("建立用户后发Email,用户ID{0}", evt.UserId);    }    #endregion  }

 

感谢各位的阅读!

回到目录


普吉岛旅游团报价优惠普吉岛蜜月旅游行程参考普吉岛特价旅游多少钱新加坡旅游不可错过的十大趣味美食(全文) 美景美食:8个理由令你让上菲律宾(全文) 日本惊现痔疮神殿 专治痔疮香客火爆 世贸天阶好玩吗?有什么好玩的? 重庆有什么好玩的地方? 香港迪斯尼乐园的门票是多少? 深圳坐船去澳门船票要多少钱? 去香港玩暑假期间哪个时段比较合适? 香港迪士尼有哪些娱乐项目? 畅游武安古武当山 兔屎茶“解酒?各国闻所未闻的奇葩解酒法(全文) 40415 海南欢乐节去玩吗?第15届海南欢乐节优惠景点有哪些? 40416 海南欢乐节有什么好玩的?第十五届海南欢乐节节目介绍? 40417 “新世界7大奇观城市”出炉 黎巴嫩首都居首(全文) 40418 看奇幻魔界 听野人传说 40419 2015南京冰雪奇缘圣诞主题展举办时间、地点、门票以及活动详情怎么样? 40420 禁止使用硬币购物?世界八国最奇葩规定(全文) 40421 海南欢乐节有什么活动?2015海南欢乐节活动介绍? 4042 “融和粤菜”取之于自然,食之于丽轩[三] Atmel IC AT83C24NDS-PRTUM Datasheet Atmel IC AT83C24NDS-TISUL Datasheet Connectors PPPN162FJFN Datasheet Connectors PPPN171FGGN Datasheet ERJ-S14F1211U Datasheet ERJ-S14F1212U Datasheet 广州到朝阳市南北塔旅游 广州到朝阳市南北塔旅游 广州到朝阳市南北塔旅游 广州到朝阳五连城遗址旅游 广州到朝阳五连城遗址旅游 广州到朝阳五连城遗址旅游