关于在工作单元触发领域事件问题
关于在工作单元触发领域事件问题
情景:比如我在工作单元内需要触发某些事件。然后工作单元结束后又触发某些事件。比如:下完订单后,发送消息到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。进行持久化对象的时候则会触发所有的领域对象。
如果没有调用过这个方法。则不会发布领域事件。
***/
                    
                
                
            
        
浙公网安备 33010602011771号