首页 > 其他分享 >利用Abp过滤器实现业务数据“回收站”功能

利用Abp过滤器实现业务数据“回收站”功能

时间:2023-07-20 09:12:00浏览次数:31  
标签:删除 Abp 过滤器 OnlyShowSoftDelete FileDataFilters public 回收站

@

目录

原理

回收站是当用户删除一条记录时,不是直接从数据库中删除,而是将其放入“回收站”,以便用户可以在需要时恢复数据。

在Abp框架中,若实体实现了ISoftDelete,则将实体标记为删除时不是物理删除,而是“软删除”

public interface ISoftDelete
{
    /// <summary>
    /// Used to mark an Entity as 'Deleted'. 
    /// </summary>
    bool IsDeleted { get; set; }
}

当使用仓储删除一条记录时,ABP会自动将 IsDeleted 设置为true,并将删除操作替换为修改操作。 在查询数据库时会自动过滤软删除的实体。

利用这个原理,可以将“软删除”行为认为是放入了“回收站”,而将“恢复”行为认为是从“回收站”中取出。将记录硬删除的行为认为是“永久删除”, 将全部已“软删除”的记录硬删除,则是“清空回收站”

因此我需要实现一个自定义过滤器,用于查看已删除的实体。

创建过滤器

定义仅查看软删除的过滤器,命名"OnlyShowSoftDelete"

public class FileDataFilters
{
    public const string OnlyShowSoftDelete = "OnlyShowSoftDelete";

}

在模块中注册过滤器,isEnabledByDefault参数为false,默认不启用

Configuration.UnitOfWork.RegisterFilter(FileDataFilters.OnlyShowSoftDelete, false);

在DbContext中,增加IsOnlyShowSoftDeleteFilterEnabled属性,用于判断当前的查询上下文中是否启用了“仅查看软删除”过滤器

public bool IsOnlyShowSoftDeleteFilterEnabled => CurrentUnitOfWorkProvider?.Current?.IsFilterEnabled(FileStorage.Uow.FileDataFilters.OnlyShowSoftDelete) == true;

在DbContext中,重写CreateFilterExpression方法,当启用了“仅查看软删除”过滤器时,自动过滤软删除的实体

protected override Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
{
    var expression = base.CreateFilterExpression<TEntity>();
    if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
    {
        Expression<Func<TEntity, bool>> softDeleteFilter = e => !IsOnlyShowSoftDeleteFilterEnabled || ((ISoftDelete)e).IsDeleted;
        expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter);
    }

    return expression;
}

使用过滤器

查询

查询正常业务时,不需要对默认的过滤器做操作。

在查看“回收站”中的数据时,需要关闭AbpDataFilters.SoftDelete过滤器,打开FileDataFilters.OnlyShowSoftDelete过滤器。

在使用仓储做任何查询(如: GetAll或Get)之前,加入以下代码:

UnitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete);
UnitOfWorkManager.Current.EnableFilter(FileDataFilters.OnlyShowSoftDelete);

删除

在删除记录时,通过调用仓储的Delete()方法,将记录放入“回收站”中。调用HardDelete()方法,将记录永久删除。


public virtual async Task DeleteAsync(File file, bool isHardDelete = false)
{
    if (isHardDelete)
    {
        await _repository.HardDeleteAsync(file);  //永久删除
    }
    else
    {
        await _repository.DeleteAsync(file);       //放入“回收站”
    }
}

恢复

获取已经“软删除”的记录,调用UnDelete()方法,将记录从“回收站”中取出

UnitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete);
UnitOfWorkManager.Current.EnableFilter(FileDataFilters.OnlyShowSoftDelete);

var currentFile = await _repository.GetAsync(file.Id);
currentFile.UnDelete();

标签:删除,Abp,过滤器,OnlyShowSoftDelete,FileDataFilters,public,回收站
From: https://www.cnblogs.com/jevonsflash/p/17567356.html

相关文章

  • ABP-配置设置
    配置设置ABP遵循的是约定大于配置,作为约定的内容需要在应用程序中进行设置。定义设置在设置之前需要先定义他,由于ABP是模块化的,不同模块都可以拥有自己独立的设置参数,只需要在类中派生SettingDefinitionProvider类//ABP会自动发现并和注册设置的定义publicclassStudentSet......
  • 视频过滤器LAVFilters安装
    点击下载链接下载安装包双击安装包进行安装全部next下一步即可最后点击Finish完成安装......
  • DRF过滤器
    https://www.django-rest-framework.org/api-guide/filtering一般情况下,我们可以重写DRF视图类的get_queryset()方法来实现查询结果集的过滤。例如,根据request.user来过滤结果集frommyapp.modelsimportPurchasefrommyapp.serializersimportPurchaseSerializerfromrest......
  • Abp Blazor WebAssembly - Polymorphic DTO Deserialization using System.Text.Json
    @@abp4.0dtojobject https://stackoverflow.com/questions/70032776/abp-blazor-webassembly-polymorphic-dto-deserialization-using-system-text-json1AbpFrameworkversion:5.0.0-beta2,UI:BlazorWebAssemblyI'mattemptingtoimplementpolymo......
  • vue-day21-过滤器学习
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>过滤器</title><scripttype=......
  • MVC三层架构,过滤器、监听器及常见应用
    MVC三层架构什么是MVC:ModelViewController模型、视图、控制器10.1早些年控制器ControllerServlet:接收用户的请求响应给客户端内容重定向或者转发视图层ViewJSP:展示数据提供可以供我们操作的请求Servlet和JSP都可以写JAVA代码;为了易于维护和使用;Servlet专注于......
  • Abp Framework手动实践
    上一章节有很大一部分是使用默认的CRID进行操作的,本章节将手动进行各层的编写,本次以Student为模块进行开发。领域层实体在***.Domain项目中创建Student文件夹,并在文件夹中创建Student的实体类,该实体类继承FullAuditedAggregateRoot<Guid>类,主键为Guid类型。Student共有三个属......
  • java过滤器塞不进去参数原因
    Java过滤器塞不进去参数原因解决方法作为一名经验丰富的开发者,我将为你解释在Java中为什么过滤器无法将参数传递,并提供解决方法。首先,让我们看一下整个过程的步骤:步骤操作1在Web.xml中配置过滤器2创建过滤器类3在过滤器类中获取和处理参数步骤1:在Web.xml中......
  • 让桌面显示“回收站”和“计算机”(ubuntu)
    使用快捷键Alt+F2打开运行窗口.键入gconf-editor,打开Gnome配置编辑器.定位到apps\nautilus\desktop.勾选trash_icon_visible显示“回收站”勾选computer_icon_visible显示“计算机”......
  • ABP Framework
    ABPFramework模板运行安装并下载模板安装ABPCLI,第一步是安装ABPCLIdotnettoolinstall-gVolo.Abp.Cli然后使用abpnew命令在空文件夹中创建新解决方案://项目名称为AbpBlazor.BookStore//UI模板使用BlazorServer模式,默认为MVC//数据库使用MySql(EFframework)......