我们在数据库开发中,一般会运用软删除 (soft delete)模式 ,即不直接从数据库删除数据 ,而是标记这笔数据为已删除。因此 ,如果实体被软删除了,那么它就应该不会在应用程序中被检索到。要达到这种效果 ,我们需要在每次检索实体的查询语句上添加 SQL的 Where条件 IsDeleted = false 。这是个乏味的工作 。但它是个容易被忘掉的事情。因此 ,我们应该要有个自动的机制来处理这些问题 。

ABP 提供数据过滤器 (Data filters),它使用 自动化的,基于规则的过滤查询。

ABP已做好的过滤器

ISoftDelete

publicclass Person : Entity, ISoftDelete

{

publicvirtualstring Name { get; set; }

publicvirtualbool IsDeleted { get; set; }

}

如上面的Person类,实现了ISoftDelete接口,当我们使用IRepository.Delete方法删除一个Person时,该Person并不真的从数据库删除,仅仅是IsDeleted属性被设置为true。

publicclass MyService

{

privatereadonly IRepository _personRepository;

publicMyService(IRepository personRepository)

{

_personRepository = personRepository;

}

public List GetPeople()

{

return _personRepository.GetAllList();

}

}

GetPeople method only gets Person entities which has IsDeleted = false (not deleted). All repository methods and also navigation properties properly works. We could add some other Where conditions, joins.. etc. It will automatically add IsDeleted = false condition properly to the generated SQL query.

如上面代码,如果某个Person已经被软删除,那么使用IRepository获取所有Person数据时,过滤器会自动过滤掉已经软删除的Person,也就是说,GetAll不是获取实际上数据库还存有的所用Person数据,而是排除了之前被软删除的数据了。

A side note: If you implement IDeletionAudited (which extends ISoftDelete) then deletion time and deleter user id are also automatically set by ASP.NET Boilerplate.

IMustHaveTenant

publicclass Product : IMustHaveTenant

{

publicvirtualint TenantId { get; set; }

publicvirtualstring Name { get; set; }

}

如果你创建了一个多租户的应用程序(储存所有租户的数据于单一一个数据库中),你肯定不会希望某个租户看到其他租户的资料,此时你可以实现IMustHaveTenant接口。

ABP会使用IABPSession来取得当前TenantId并且自动地替当前租户进行过滤查询处理。

If current user is not logged in to the system or current user is a host user (Host user is an upper level user that can manage tenants and tenant datas), ASP.NET Boilerplate automatically disables IMustHaveTenant filter. Thus, all data of all tenant's can be retrieved to the application. Notice that this is not about security, you should always authorize sensitive data.

IMayHaveTenant

publicclass Product : IMayHaveTenant

{

publicvirtualint? TenantId { get; set; }

publicvirtualstring Name { get; set; }

}

If an entity class shared by tenants and the host (that means an entity object may be owned by a tenant or the host), you can use IMayHaveTenant filter.

IMayHaveTenant接口定义了TenantId,但是注意它是int?类型,可为空。

A null value means this is a host entity, a non-null value means this entity owned by a tenant which's Id is the TenantId. ASP.NET Boilerplate uses IAbpSession to get current TenantId. IMayHaveTenant filter is not common as much as IMustHaveTenant. But you may need it for common structures used by host and tenants.

禁用过滤器

var people1 = _personRepository.GetAllList();

using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete))

{

var people2 = _personRepository.GetAllList();

}

var people3 = _personRepository.GetAllList();

启用过滤器

也就是使用_unitOfWorkManager.Current.EnableFilter方法

设定过滤器参数

CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42);

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

自定义过滤器

首先定义一个接口:

publicinterface IHasPerson

{

int PersonId { get; set; }

}

实现接口:

publicclass Phone : Entity, IHasPerson

{

[ForeignKey("PersonId")]

publicvirtual Person Person { get; set; }

publicvirtualint PersonId { get; set; }

publicvirtualstring Number { get; set; }

}

重写DbContext类中的OnModelCreating 方法(用的EntityFramework.DynamicFilters,参考https://github.com/jcachat/EntityFramework.DynamicFilters):

protectedoverridevoidOnModelCreating(DbModelBuilder modelBuilder)

{

base.OnModelCreating(modelBuilder);

modelBuilder.Filter("PersonFilter", (IHasPerson entity, int personId) => entity.PersonId == personId, 0);

}

"PersonFilter" is the unique name of the filter here. Second parameter defines filter interface and personId filter parameter (not needed if filter is not parametric), last parameter is the default value of the personId.

最后,我们要把过滤器注册到ABP的工作单元系统中,以下代码需要写在模块的Preinitialize方法里:

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

First parameter is same unique name we defined before. Second parameter indicates whether this filter is enabled or disabled by default. After declaring such a parametric filter, we can use it by supplying it's value on runtime.

using (CurrentUnitOfWork.EnableFilter("PersonFilter"))

{

CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42);

var phones = _phoneRepository.GetAllList();

//...

}

ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...

ABP理论学习之数据过滤器

返回总目录 本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除 ...

ABP官方文档翻译 3.8 数据过滤器

数据过滤器 介绍 预定义过滤器 ISoftDelete 何时使用? IMustHaveTenant 何时使用? IMayHaveTenant 何时使用 禁用过滤器 关于using语句 关于多租户 全局 ...

ABP 配置全局数据过滤器

ABP官方数据过滤的地址:https://aspnetboilerplate.com/Pages/Documents/Data-Filters 中文可以看这个:https://aspnetboiler ...

文章翻译:ABP如何在EF core中添加数据过滤器

abp过滤规则android,ABP的数据过滤器(Data Filters)相关推荐

  1. abp过滤规则android,撰写 Adblock Plus 过滤规则

    当前的 Adblock Plus 版本允许您通过许多不同的方法来优化过滤规则.本文档就是告诉您如何做. 声明:这里给出的过滤规则只是示例,不一定能直接使用. AdBlock Plus 过滤规则介绍 本 ...

  2. scrapy中自定义过滤规则以及start_urls不进过滤器的问题

    为什么要自定义过滤规则呢? 首先,我们需要过滤,但是不是说抓一次就不抓了,因为我们的抓取是一段时间抓取一次 自定义策略如下: 首先我试图直接继承RFPDupeFilter 在settings.py同级 ...

  3. ABP理论学习之数据过滤器

    本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除的" ...

  4. ABP中的数据过滤器

      本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant),然后介绍了如何实现一个自定义过滤器,最后介绍了在软件开发过程中遇到的实际问题,同时给出了 ...

  5. ABP vNext详细教程——数据过滤器

    目录 简介 基础用法 2.使用 3.查询拼装 4.​​​​​​​禁用 5.​​​​​​​补充说明 源码解析 1.DataFilter 2.AbpDbContext 简介 数据过滤器是ABP vNext ...

  6. wireshark抓包后查看数据报时的过滤规则/过滤语法及举例说明

    wireshark抓包后查看数据报时的过滤规则/过滤语法及举例说明过滤器的区别捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.需要在开始捕捉前设置.显示过滤器(Di ...

  7. wireshark过滤规则及过滤数据内容是否包含

    Wireshark 基本语法,基本使用方法,及包过滤规则,如果想在linux上进行抓包,可以使用tcpdump 先保存为cap文件,然后将cap下载到本地使用wireshark打开进行分析 1.过滤I ...

  8. fiddler启用过滤规则只显示想要的接口数据

    fiddler启用过滤规则只显示想要的接口数据 比如只显示192.168.11.80站点数据 点击应用规则就可以只显示192.168.11.80了 转载于:https://www.cnblogs.co ...

  9. adblock过滤规则编写

    本指南旨在帮助您编写和维护自己的Adblock Plus过滤器.通过创建自己的过滤器,您可以更好地控制要访问的网站上不希望看到的东西,包括广告,图像,请求和脚本. 重要提示:本指南中的所有过滤器示例仅 ...

最新文章

  1. JAVA中的枚举小结
  2. unity android 启动,Android启动Unity
  3. 模拟命令行自动输入的HTML,HTML5 命令行界面仿真和自动打字动画
  4. java基础之构造方法
  5. 在JDK 11中启动单文件源代码程序
  6. idea中drl文件_得分DRL:在OptaPlanner中更快,更轻松
  7. sae项目服务器,基于SAE的游戏服务器: Server on SAE for RGSS Games 部署在SAE上的简易游戏服务器,为用 RMXP/VX/VA 开发的游戏提供网络服务...
  8. 完善获取数据库数据的写法
  9. 我的docker随笔34:gitlab服务部署
  10. 那些一心想要离开 BAT 的人,后来怎么样了?
  11. zynq创建ramip核
  12. Linux产生僵尸进程和孤儿进程及区别
  13. DBSCAN聚类算法原理总结
  14. 致虚极,守静笃【转】
  15. 大学计算机简单的感想,爱计算机的我大学生活感悟
  16. 腾“云”架“雾”,3DCAT实时渲染带你进入元宇宙
  17. 海康内置4G卡的摄像头设备无法注册EasyCVR平台是什么原因?
  18. ERP财务管理系统有哪些特点
  19. 985 211计算机考研科目,考研想上985/211,你各科分数至少要考这么多!
  20. 最简便的方法搭建Hexo+Github博客,基于Next主题

热门文章

  1. flink的批处理和流处理
  2. 3ds Max 材质贴图
  3. 免费网店系统下载地址
  4. MySQL笔记--2、3、4、5
  5. scrapy爬虫实战教程
  6. 互联网快讯:国家植物园在北京正式揭牌;极米Z6X Pro、极米H3S获赞赏;人民币兑日元逼近20大关
  7. 在线共享音乐吧(Online Share Music Bar)解决方案
  8. 波特兰:特别奖金3月PADNUG与Adam Cogan会面
  9. python(2) 简单字符串
  10. matlab用switch画出分段函数,matlab用switch语句绘出分段函数 在 的图像