zoukankan      html  css  js  c++  java
  • 关于在工作单元触发领域事件问题

    关于在工作单元触发领域事件问题

    情景:比如我在工作单元内需要触发某些事件。然后工作单元结束后又触发某些事件。比如:下完订单后,发送消息到rabbitMQ.

    public class MyHandler : IEventHandler<MyEventData>
    {
        private readonly IUnitOfWorkManager _unitOfWorkManager;
    
        public MyHandler(IUnitOfWorkManager unitOfWorkManager)
        {
            _unitOfWorkManager = unitOfWorkManager;
        }
    
        public void HandleEvent(MyEventData eventData)
        {
            if (_unitOfWorkManager.Current != null)
            {
                _unitOfWorkManager.Current.Completed += (sender, args) =>  Handle(eventData);
            }
            else
            {
                Handle(eventData);
            }
        }
    
        private void Handle(MyEventData eventData)
        {
            //TODO: Handle your event here...
        }
    }
    

    abp的issues回答链接:Provide a way of adding items to DomainEvents in AggregateRoot, which are triggered after UOW succeed

    在AggregateRoot中触发DomainEvents逻辑思考。

    namespace Abp.Domain.Entities
    {
        public class AggregateRoot : AggregateRoot<int>, IAggregateRoot
        {
    
        }
    
        public class AggregateRoot<TPrimaryKey> : Entity<TPrimaryKey>, IAggregateRoot<TPrimaryKey>
        {
            [NotMapped]
            public virtual ICollection<IEventData> DomainEvents { get; }
    
            public AggregateRoot()
            {
                DomainEvents = new Collection<IEventData>();
            }
        }
    }
    

    如何发布领域事件:

    DomainEvents.Add(new BlogUrlChangedEventData(this, oldUrl));
    

    因为在AbpDbContext.SaveChanges()之后会触发所有领域事件。

    所以我们只需要在聚合中,需要触发某些事件的时候发布领域事件即可。

    比如我们在订单添加的时候,需要触发AddOrderEventData。

    则:

    
    //Order聚合根中
    public class OrderAggregateRoot
    {
    
        public void CreateOrder(object orderObj)
        {
            //...
            //...
            DomainEvents.Add(new AddOrderEventData(this));
        }
        public void Cancel()
        {
            //...
            //...
            DomainEvents.Add(new CancelOrderEventData(this));
        }
    }
    /***
    那么当这个OrderAggregateRoot。进行持久化对象的时候则会触发所有的领域对象。
    如果没有调用过这个方法。则不会发布领域事件。
    ***/
    

    参考博文: 关于ABP聚合根类AggregateRoot的思考

  • 相关阅读:
    uni-app中使用Echarts绘画图表
    css设置Overflow实现隐藏滚动条的同时又可以滚动
    JS判断在哪一端浏览器打开
    ElementUI分页Pagination自动到第一页
    第203场周赛
    TreeSet使用
    155 最小栈
    234 回文链表
    141 环形链表
    2 两数相加
  • 原文地址:https://www.cnblogs.com/mainxx/p/9341863.html
Copyright © 2011-2022 走看看