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

在工作单元后再触发领域事件

Posted by Joven on June 19, 2018

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

情景:比如我在工作单元内需要触发某些事件。然后工作单元结束后又触发某些事件。比如:下完订单后,发送消息到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的思考