ABP-数据过滤器(Fliter)

过滤器文档地址

ABP预定义过滤器

过滤器禁用

对于默认启动的过滤器,可以使用using语句临时禁用,也可全局禁用

using语句临时禁用软删除过滤

using (CurrentUnitOfWork.DisableAuditing(AbpDataFilters.SoftDelete))
{
  var list=_approvaloperaterecordsRepository.GetAll();
}
using (_unitOfWorkManager.Current.DisableAuditing(AbpDataFilters.SoftDelete))
{
  var list=_approvaloperaterecordsRepository.GetAll();
}

注:您可以注入 IUnitOfWorkManager 并像示例中一样使用它,如果您的类 继承一些特殊的基类(如应用程序服务、 AbpController, AbpApiController...)也可以使用示例中快捷方式CurrentUnitOfWork 。

全局禁用过滤器

可以在模块的PreInitialize方法中配置如下内容全局禁用

Configuration.UnitOfWork.OverrideFilter(AbpDataFilters.SoftDelete, false);

过滤器参数设置

带参过滤器还可重新设置参数,如下 IMayHaveTenant 设置 tenantId 值的示例

 CurrentUnitOfWork.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, 42);

 

自定义数据过滤器

1.定义接口

public interface IHasPerson
{
  int PersonId { get; set; }
}

2.让需要该数据过滤的实体继承接口

public class Phone : Entity, IHasPerson
{
        [ForeignKey("PersonId")]
        public virtual Person Person { get; set; }
        public virtual int PersonId { get; set; }
        public virtual string Number { get; set; }
 }

3.在我们的 DbContext 类中,我们 覆盖 OnModel创建并定义筛选器

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Filter("PersonFilter", (IHasPerson entity, int personId) => entity.PersonId == personId, 0);//“PersonFilter”过滤器名称,名字唯一
}

“PersonFilter”是此处筛选器的唯一名称。第二个参数定义了过滤器接口和personId过滤器参数(如果过滤器不是参数化的,则不需要)。最后一个参数是personId的默认值。

 

4.最后,我们必须在模块的PreInitialize方法中将此筛选器注册到ASP.NET Boilerplate的工作单元系统中

 Configuration.UnitOfWork.RegisterFilter("PersonFilter", false);

第一个参数与我们之前定义的唯一名称相同。第二个参数指示默认情况下是启用还是禁用此筛选器。在声明了这样一个参数过滤器之后,我们可以通过在运行时提供它的值来使用它。

5.使用

using (CurrentUnitOfWork.EnableFilter("PersonFilter"))//临时启用“PersonFilter”
{
        using(CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42))//设置"PersonFilter"的参数“personId”参数设置值
        {
            var phones = _phoneRepository.GetAllList();
            //...
        }
}

我们可以从某些来源获取personId,而不是静态编码。上面的例子是针对参数过滤器的。一个过滤器可以有零个或多个参数。如果它没有参数,则不需要设置过滤器参数值。此外,如果默认情况下已启用,则无需手动启用(您可以始终禁用此功能)。

 

posted @ 2023-09-07 11:39  流年sugar  阅读(288)  评论(0编辑  收藏  举报