问题描述
我正在使用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();
});
}