如何在Abp.IRepository <TEntity>中的CRUD之前注入动作

问题描述

我正在使用Volo.Abp 3.0.4(Abp框架)。我需要创建一些将在IRepository类中的某些方法(CreateAsync,UpdateAsync等)之前发生的动作。但是我只是不能覆盖存储库,因为我的客户端应该需要多个这些动作中的一个

这些操作的范围从获取有关实体(TEntity)的一些信息到触发一些操作以仅在真正命中数据库之前记录一些内容。这不是继承的问题,而是组成的问题-我要做一连串的操作,客户可以选择那些操作。

所以我的问题是:我怎样才能以一种简单且可扩展的方式实现这一目标?谢谢你们!

编辑:我当时想我可以一次在其中覆盖我想要的方法获取实现接口的所有对象并按顺序运行它们。这是个好方法还是已经实施了?

解决方法

当您对实体进行更改时,某些事件会自动触发,这些事件会发出事件数据对象,它们是EntityCreatingEventData<TEntity>,EntityCreatedEventData<TEntity>,EntityUpdatingEventData<TEntity>,EntityUpdatedEventData<TEntity>,EntityDeletingEventData<TEntity>,EntityDeletedEventData<TEntity>,EntityChangingEventData<TEntity>,EntityChangedEventData<TEntity>

' ing '事件(例如EntityUpdating)在提交事务之前被触发,而' ed '事件(例如EntityUpdated)被触发提交交易后。

您可以创建事件处理程序以订阅这些事件。例如,

public class MyHandler : ILocalEventHandler<EntityCreatedEventData<IdentityUser>>,ITransientDependency
{
    public async Task HandleEventAsync(EntityCreatedEventData<IdentityUser> eventData)
    {
        var userName = eventData.Entity.UserName;
        var email = eventData.Entity.Email;
        //...
    }
}

View more detail in their document

注意:版本3.0发布后,他们需要进行额外的配置才能启用内置事件。因此,只需将此配置添加到模块类中,即可使用 ... DomainModule

public override void ConfigureServices(ServiceConfigurationContext context)
{
    ...
    
    Configure<AbpDistributedEntityEventOptions>(options =>
    {
        //Enable for all entities
        options.AutoEventSelectors.AddAll();
    });
}

View more detail about the configuration

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...