【问题标题】:Entity history tracking and event handlers abp v3.4.0实体历史跟踪和事件处理程序 abp v3.4.0
【发布时间】:2018-01-30 23:46:46
【问题描述】:

我刚刚更新到 abp v3.4.0,我目前正在研究历史跟踪功能,因为我认为这对我来说可能非常有用。

我只是不确定如何实际获取信息以及它与 Abp 系统的其余部分的关系。

所以这就是我认为它应该在我心中发挥作用的方式。

  1. 更新了实体的属性,即启用 => 禁用。
  2. 订阅实体更新事件。
  3. 通过实体历史检查实体是否从启用 => 禁用。
  4. 执行一些其他操作。

现在我不确定的是如何从更新事件中获取实体历史信息。

我已尝试在 IEventHandler 中使用存储库 private readonly IRepository<EntityChangeSet,long> _entityChangeRepository;,但这似乎不会在触发更新事件之前“保存更改”。

那么访问实体历史信息的正确方法是什么?甚至可以通过事件访问它吗?

谢谢!

【问题讨论】:

    标签: aspnetboilerplate


    【解决方案1】:

    实体历史记录用于审计目的。

    EntityChangeSet 在您的实体更新后保存(并且在其Updated 事件被触发后)。

    甚至可以通过事件访问它吗?

    坏消息:您无法通过您实体的Updated 事件访问它(没有广泛的黑客攻击)。

    好消息:但您可以通过一个事件访问它。

    那么访问实体历史信息的正确方法是什么?

    EntityChangeSet 实体的Created 事件中访问它。

    IEventHandler<EntityCreatedEventData<EntityChangeSet> 实现一个事件处理程序。

    在那里,你可以:

    • 检查您的实体是否在EntityChangeSet.EntityChanges
    • 检查EntityChange.ChangeType是否为EntityChangeType.Updated
    • 检查属性是否在EntityChange.PropertyChanges
    • “检查实体是否从启用 => 禁用通过”PropertyChange,最后
    • “执行一些其他操作。”

    同样,实体历史记录用于审计目的,所以这并不简单。但现在可以了! :)

    【讨论】:

    • 谢谢!这确实解决了我的问题,尽管我确实在对该事件中的实体进行更改时遇到了一些问题,所以我最终触发了另一个事件。这可能是我在 GitHub 上提出的,但是查看当前的 IEventHandler<EntityCreatedEventData<EntityChangeSet>> 代码,当跟踪来自多个实体的多个属性时,它会变得巨大。是否值得将 EntityChange 更改为 EntityChange<MyEntity> 以便我们可以利用他们创建的事件处理程序?我认为它会更好地将代码分开。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2022-06-14
    • 2014-01-22
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多