事件中的链式修改

时间:2018-11-30 15:50:08

标签: c# entity-framework .net-core aspnetboilerplate

ASP.NET Boilerplate have EventBus system,我们有事件

  • EntityCreatingEventData
  • EntityCreatedEventData
  • EntityDeletingEventData
  • EntityDeletedEventData

  • ...

但是这些事件在调用SaveChanges()之后才有效(数据已经存在于DB中)。当尚未将数据写入DB时,我们需要在调用SaveChanges()之前使用事件系统

我们还需要递归事件系统,例如:

创建对象A =>调用EntityCreatingBeforeSaveEventData(a)=>在此句柄中,我们创建新对象B并调用Repository.Insert(b)=>调用EntityCreatingBeforeSaveEventData(b)... 并且此过程调用时在数据库上下文中存在任何修改。

1 个答案:

答案 0 :(得分:1)

取决于entity.Id

在调用SaveChanges()之前不可能有域事件系统。

  • ASP.NET Boilerplate在调用SaveChanges()时检测到更改。
  • 递归事件可能会导致无限循环-请参见#1616
  • 无法识别带有Id且尚未设置(自动生成)的对象。

如果您依赖于这样的系统,那么关注点分离可能会很差。

独立于entity.Id

您可以直接使用IEventBus

触发事件:

public class AManager : DomainService, IAManager
{
    public void CreateA()
    {
        var a = new A();
        Repository.Insert(a);
        EventBus.Trigger(new EntityCreatingBeforeSaveEventData<A>
        {
             Property = a.SomeProperty // Can pass other properties
        });
    }
}

public class BManager : DomainService, IBManager
{
    // Similar to above
}

处理事件:

public class AHandler : IEventHandler<EntityCreatingBeforeSaveEventData<A>>, ITransientDependency
{
    public IBManager BManager { get; set; }

    public void HandleEvent(EntityCreatingBeforeSaveEventData<A> eventData)
    {
        var aSomeProperty = eventData.Property;
        BManager.CreateB();
    }
}