ABP 配置全局数据过滤器
可以不看下面内容,直接看这: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 配置全局数据过滤器的更多相关文章
- ABP 配置全局数据过滤器 II
第一篇 那种写法有些复杂, 简单办法是直接注入 切换到 ***.EntityFramework 项目 在Uow 里面创建 ***EfUnitOfWork.cs 类 public class Coope ...
- ABP中的数据过滤器
本文首先介绍了ABP内置的软删除过滤器(ISoftDelete)和多租户过滤器(IMultiTenant),然后介绍了如何实现一个自定义过滤器,最后介绍了在软件开发过程中遇到的实际问题,同时给出了 ...
- ABP(现代ASP.NET样板开发框架)系列之13、ABP领域层——数据过滤器(Data filters)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之13.ABP领域层——数据过滤器(Data filters) ABP是“ASP.NET Boilerplate P ...
- ABP理论学习之数据过滤器
返回总目录 本篇目录 介绍 预定义过滤器 关闭过滤器 开启过滤器 设置过滤器参数 定义自定义过滤器 其他ORM 介绍 软删除模式通常用于不会真正从数据库删除一个实体而是仅仅将它标记为"已删除 ...
- 扩展EF的Fluent API中的 OnModelCreating方法 实现全局数据过滤器
1.生成过滤的表达式目录树 protected virtual Expression<Func<TEntity, bool>> CreateFilterExpression&l ...
- ABP官方文档翻译 3.8 数据过滤器
数据过滤器 介绍 预定义过滤器 ISoftDelete 何时使用? IMustHaveTenant 何时使用? IMayHaveTenant 何时使用 禁用过滤器 关于using语句 关于多租户 全局 ...
- 文章翻译:ABP如何在EF core中添加数据过滤器
原文地址:https://aspnetboilerplate.com/Pages/Documents/Articles%5CHow-To%5Cadd-custom-data-filter-ef-cor ...
- ABP的数据过滤器(Data Filters)
http://www.aspnetboilerplate.com/Pages/Documents/Data-Filters 我们在数据库开发中,一般会运用软删除 (soft delete)模式 ,即不 ...
- vue 中全局filter过滤器的配置及使用
在项目中使用到的经常用到过滤器,比如时间,数据截取等过滤器,如果在每个.vue中都可以复制同一个过滤器,这可以达到目的,但是遇到方法有bug时就需要诸葛修改进入不同的页面修改,这样既费时又费力,优先可 ...
随机推荐
- Apache Dubbo已不再局限于Java语言
2017 年 9 月 7 日,在沉寂了4年之后,Dubbo 悄悄的在 GitHub 发布了 2.5.4 版本.随后又迅速发布了 2.5.5.2.5.6.2.5.7 等release.在 2017年 1 ...
- 不要天真了,这些简历HR一看就知道你是培训的,质量不佳的那种
上到职场干将下到职场萌新,都会接触到包装简历这个词语.当你简历投到心仪的公司,公司内负责求职的工作人员是如何甄别简历的包装程度的?Jason 老师根据自己的经验写下了这篇文章,谁都不是天才,包装无可厚 ...
- JAVA开发第一步 - JDK安装与配置
JDK的安装与环境变量配置是JAVA开发之路的第一步,很多新人在这一步上就卡了很久,浪费了很多时间,甚至有些人就轻易地“从入门到放弃”了.今天我们就来一步步教你如何打倒这第一只拦路虎. 1.JDK下载 ...
- Greenplum高可用真的高吗?
目录 1. 问题描述 2. 解决方案 @ 1. 问题描述 在项目中使用了Greenplum做分析型数据库,Greenplum自身已经提供了高可用方案,Master节点提供Sdanby备用节点,Segm ...
- break使用不当引发的一个“血案”
最近在网上冲浪,读到一则新闻,摘抄下这则新闻: ======================= 以下文字摘抄自互联网==================== 1990年1月15日,AT&T电话 ...
- Centos6.5安装Redis3.2.8
1 - Redis安装 redis安装 在网上一搜一大把,但是还是在这里想要能够统一吧,所以这个安装步骤是在Centos6.5 Minimal 上安装redis3.4.8,本次安装是在root 用户下 ...
- Junit初级应用实例
Request: public interface Request { String getName(); } Response: public interface Response { String ...
- BI之路学习笔记3--olap cube理解实例
为什么会产生OLAP? 随着数据库技术的发展应用,数据库存储的数据量从M字节以及G(千兆)字节过渡到T字节和P字节,同时,用户的查询需求也越来越复杂,设计的已不仅是查询或者操纵一张关系表中的一条或几条 ...
- redis分布式锁的问题和解决
分布式锁 在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求.具体伪代码如下: public void doSomething(String userId ...
- 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱
在财务工作过程中,很大时候需要使用到凑数的需求,花了两三天时间认真研究了一下,本人水平也只能做代码搬运工,在用户体验上作了一下完善.完成了Excel版的凑数功能. 文章出处说明 原文在简书上发表,再同 ...