可以不看下面内容,直接看这:https://www.cnblogs.com/MindSharing/p/11283914.html

================================

ABP官方数据过滤的地址:https://aspnetboilerplate.com/Pages/Documents/Data-Filters

中文可以看这个:https://aspnetboilerplate.com/Pages/Documents/Data-Filters

看完后最大问题就是,自定义的数据过滤和UOW中事务是在一起的

using (CurrentUnitOfWork.EnableFilter("PersonFilter"))
{
using(CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42))
{
var phones = _phoneRepository.GetAllList();
//...
}
}

总不可能每次我写服务的时候,都在方法里面写一串这个代码吧,那这样也没方便多少

所以可以考虑使用我方法来给过滤器全局设置一个值。

我的应用场景是这样的,我的项目登录的时候会让用户选择一个专业,所有数据都是这个专业下的,什么建筑啊,结构啊

为了实现这个筛选,先还是需要建立过滤器,在Core项目添加一个接口

    public interface IHasMajor
{
string Major { get; set; }
}

 在EF项目中的DbContext.cs 中注册 过滤器

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder); modelBuilder.Filter("MajorFilter", (IHasMajor entity, string major) => entity.Major == major, ""); }

 在你需要筛选专业的实体里面实现这个接口

  [Table("DictionaryInfo")]
public class DictionaryInfo : FullAuditedEntity, IHasMajor
{
public virtual int? ParentId { get; set; } public virtual string Value { get; set; } public virtual string Description { get; set; } public virtual DictionaryInfo ParentDictionaryInfo { get; set; } public virtual ICollection<DictionaryInfo> ChildDictionaryInfos { get; set; } public virtual string Major { get; set; }
}

  好了下面就是关键的了,传统做法,我们就是在服务里面设置数据过滤的参数

        public async Task<GetDictionaryInfoOutput> GetAllDictionary()
{
using (CurrentUnitOfWork.SetFilterParameter(SysConsts.DataFilter.MajorFilter, SysConsts.DataFilter.MajorParameter, AbpSession.GetMajor()))
{
List<DictionaryInfo> dictionaries = await _dictionaryInfoRepository.GetAllListAsync();
var result = new GetDictionaryInfoOutput
{
Dictionary = dictionaries.MapTo<List<DictionaryInfoDto>>()
};
return result;
} }

  这种方式感觉很不优雅,改用拦截器来自动为每个服务注入 过滤器参数,

ABP 官方对拦截器他也给了个例子,可以看这个

https://www.codeproject.com/Articles/1080517/Aspect-Oriented-Programming-using-Interceptors-wit

添加个一个拦截器,在应用层

    public class FilterInterceptor : IInterceptor
{
private readonly IAbpSession _abpSession; private readonly IUnitOfWork _unitOfWork; private readonly IUnitOfWorkManager _unitOfWorkManager; public FilterInterceptor(
IUnitOfWork unitOfWork
, IAbpSession abpSession
, IUnitOfWorkManager unitOfWorkManager)
{
Logger = NullLogger.Instance;
_unitOfWork = unitOfWork;
_abpSession = abpSession;
_unitOfWorkManager = unitOfWorkManager;
} public ILogger Logger { get; set; } public void Intercept(IInvocation invocation)
{
string major = _abpSession.GetMajor(); _unitOfWorkManager.Current.SetFilterParameter(SysConsts.DataFilter.MajorFilter, SysConsts.DataFilter.MajorParameter, major); //Executing the actual method
invocation.Proceed();
} }

  

这里面有一个主意地方,拦截器请注入IUnitOfWorkManager ,而不是注入IUnitOfWork ,后者设置参数了,没效果

然后再注册拦截器,在应用层添加一个文件

 public static class InterceptorRegistrar
{
public static void Initialize(IKernel kernel)
{
kernel.ComponentRegistered += Kernel_ComponentRegistered;
} private static void Kernel_ComponentRegistered(string key, IHandler handler)
{
if (typeof(IApplicationService).IsAssignableFrom(handler.ComponentModel.Implementation))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(FilterInterceptor)));
}
}
}

  在应用层的ApplicationModule.cs 文件里面的PreInitialize方法里面

public override void PreInitialize()
{
InterceptorRegistrar.Initialize(IocManager.IocContainer.Kernel);
}

  好这样就注册完了,可以试试服务层每个方法都能自动判断专业了,把服务里面手动设置筛选参数的地方都可以去掉了

     public async Task<GetDictionaryInfoOutput> GetAllDictionary()
{
//using (CurrentUnitOfWork.SetFilterParameter(SysConsts.DataFilter.MajorFilter, SysConsts.DataFilter.MajorParameter, AbpSession.GetMajor()))
//{
List<DictionaryInfo> dictionaries = await _dictionaryInfoRepository.GetAllListAsync();
var result = new GetDictionaryInfoOutput
{
Dictionary = dictionaries.MapTo<List<DictionaryInfoDto>>()
};
return result;
//} }

  

专业的值是存在session里面的,如何把自己想要的值存到session 里面,可以参照这篇文章

http://www.jianshu.com/p/930c10287e2a

ABP 配置全局数据过滤器的更多相关文章

  1. ABP 配置全局数据过滤器 II

    第一篇 那种写法有些复杂, 简单办法是直接注入 切换到 ***.EntityFramework 项目 在Uow 里面创建 ***EfUnitOfWork.cs 类 public class Coope ...

  2. ABP中的数据过滤器

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

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

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

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

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

  5. 扩展EF的Fluent API中的 OnModelCreating方法 实现全局数据过滤器

    1.生成过滤的表达式目录树 protected virtual Expression<Func<TEntity, bool>> CreateFilterExpression&l ...

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

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

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

    原文地址:https://aspnetboilerplate.com/Pages/Documents/Articles%5CHow-To%5Cadd-custom-data-filter-ef-cor ...

  8. ABP的数据过滤器(Data Filters)

    http://www.aspnetboilerplate.com/Pages/Documents/Data-Filters 我们在数据库开发中,一般会运用软删除 (soft delete)模式 ,即不 ...

  9. vue 中全局filter过滤器的配置及使用

    在项目中使用到的经常用到过滤器,比如时间,数据截取等过滤器,如果在每个.vue中都可以复制同一个过滤器,这可以达到目的,但是遇到方法有bug时就需要诸葛修改进入不同的页面修改,这样既费时又费力,优先可 ...

随机推荐

  1. C语言学习书籍推荐《C陷阱与缺陷》下载

    下载地址:点我 凯尼格 (作者), 高巍 (译者) <C和C++经典著作:C陷阱与缺陷>适合有一定经验的C程序员阅读学习,即便你是C编程高手,<C和C++经典著作:C陷阱与缺陷> ...

  2. 使用wincc C脚本查找窗口句柄的方法

    关于窗口句柄的用法,网上可以搜到很多相关的文章,本文以windows API接口函数为例,简单介绍一下基本使用,主要包括找到此窗体,在找到的窗体写入数据,对窗体进行关闭,最大化,最小化的操作: 1.利 ...

  3. bzoj1584 9.20考试 cleaning up 打扫卫生

    1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 549  Solved: 38 ...

  4. Linux操作系统下文件作用

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的 ...

  5. MyBatis简单使用方式总结

    MyBatis简单使用方式总结 三个部分来理解: 1.对MyBatis的配置部分 2.实体类与映射文件部分 3.使用部分 对MyBatis的配置部分: 1.配置用log4J显式日志 2.导入包的别名 ...

  6. elasticsearch5.4集群超时

    四个节点,有两个是新增加的节点,两个老节点间组成集群没有问题,新增加了两个节点,无论是四个组成集群 # --------------------------------- Discovery ---- ...

  7. UVA10763 交换学生 Foreign Exchange 题解

    题目链接: https://www.luogu.org/problemnew/show/UVA10763 题目分析: 本题我首先想到的做法是把每一个数都map一下,然后互相判断,例如a,b两人准备交换 ...

  8. 前端html+css+JavaScript 需要掌握的单词

    前端html+css+JavaScript 需要掌握的单词   broswer 浏览器(客户端) html 超文本标记语言 css 层叠样式表 javascript 语言名字(类似python/php ...

  9. .NET Core 3.0之深入源码理解HttpClientFactory(一)

    写在前面 创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维 ...

  10. python常见模块-collections-time-datetime-random-os-sys-序列化反序列化模块(json-pickle)-subprocess-03

    collections模块-数据类型扩展模块 ''' 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque ...