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的思考

  • 相关阅读:
    lodash kebabCase
    lodash escapeRegExp 转义正则特殊字符
    lodash capitalize 首字母大写
    lodash camelCase 驼峰写法
    lodash pick
    lodash random
    lodash round
    Linux 目录结构
    每天一个linux命令(6/18):lsof命令
    Linux 内核编译步骤及配置详解
  • 原文地址:https://www.cnblogs.com/mainxx/p/9341863.html
Copyright © 2011-2022 走看看