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