ABP vNext 实现租户Id自动赋值插入

背景
在使用ABP vNext过程中,因为我们的用户体系庞大,所以一直与其他业务同时开发,在开发其他业务模块时,我们一直存在着误区:认为ABP vNext 自动处理了数据新增时的租户Id(TenantId)的自动赋值插入。直到我们开始接入用户权限模块后,发现并不如此。
思路
为了实现字段的自动赋值,且无感知的,我们的思路是做类似拦截器,在上层应用新增数据相关代码流程进入DbContext的时候,在DbContext中进行处理。
其他
问题
为了实现上层业务开发人员的【无感知】,哪怕在代码编写过程中,我们也不希望开发人员有所明显感知自己在使用经过处理的DbContext,于是想到了与Volo.Abp.EntityFrameworkCore.AbpDbContext使用同一个名字AbpDbContext。
解决方案
我们首先知道,在C#中,如果有两个命名空间下,具有同名类,那么两个类的优先级为何。
假设,我们写的类在:TripleH.AbpDbContext。我们在使用这个类的地方的命名空间为:TripleH.*.AClass。
那么在AClass中使用AbpDbContext时,我们就算引用了Volo.Abp.EntityFrameworkCore命名空间,编译时也会使用TripleH.AbpDbContext。
这是因为,C#在此处的优先级决定的,它优先找Triple.*命名空间下的AbpDbContext这个类,如果没有,就会逐级往上,找Triple命名空间下的AbpDbContext,如果找到了,就会直接使用它,使用时连命名空间都不需要手动引用。当然,如果没找过,才会去其他命名空间如Volo.Abp.EntityFrameworkCore中寻找。
实现
namespace TripleH
{
public abstract class AbpDbContext<TDbContext> : Volo.Abp.EntityFrameworkCore.AbpDbContext<TDbContext>
where TDbContext : AbpDbContext<TDbContext>
{
public AbpDbContext(DbContextOptions<TDbContext> options)
: base(options)
{
}
protected override void ApplyAbpConceptsForAddedEntity(EntityEntry entry, EntityChangeReport changeReport)
{
SetTenantIdIfNull(entry);
base.ApplyAbpConceptsForAddedEntity(entry, changeReport);
}
protected virtual void SetTenantIdIfNull(EntityEntry entry)
{
if (entry.Entity is IMultiTenant entityWithTenantId
&& entityWithTenantId.TenantId == null
&& IsMultiTenantFilterEnabled)
{
ObjectHelper.TrySetProperty(entityWithTenantId, e => e.TenantId, () => CurrentTenant.Id);
}
}
}
}
使用
//无需额外引用TripleH命名空间,做到真正的无感知,当然鼠标放到AbpDbContext上,VS 会告诉你是哪个命名空间
namespace TripleH.Test.EntityFrameworkCore
{
//此处继承的AbpDbContext,便是来自TripleH命名空间下,而非Abp
[ConnectionStringName(BasicDbProperties.ConnectionStringName)]
public class BasicDbContext : AbpDbContext<BasicDbContext>, IBasicDbContext
{
public BasicDbContext(DbContextOptions<BasicDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ConfigureBasic();
}
}
}

ABP vNext 实现租户Id自动赋值插入的更多相关文章
- X-Admin&ABP框架开发-租户管理
软件即服务概念的推动,定制化到通用化的发展,用一套代码完成适应不同企业的需求,利用多租户技术可以去做到这一点.ABP里提供了多租户这一概念并且也在Zero模块中实现了这一概念. 一.多租户的概念 单部 ...
- 用abp vNext快速开发Quartz.NET定时任务管理界面
今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...
- [Abp vNext 源码分析] - 19. 多租户
一.简介 ABP vNext 原生支持多租户体系,可以让开发人员快速地基于框架开发 SaaS 系统.ABP vNext 实现多租户的思路也非常简单,通过一个 TenantId 来分割各个租户的数据,并 ...
- Abp vNext抽茧剥丝01 使用using临时更改当前租户
在Abp vNext中,如果开启了多租户功能,在业务代码中默认使用当前租户的数据,如果我们需要更改当前租户,可以使用下面的方法 /* 此时当前租户 */ using (CurrentTenant.Ch ...
- [Abp vNext微服务实践] - 租户登录
简介 Abp vNext微服务授权验证基于ids4,实现租户登录需要在授权服务中获取token,和之前的介绍的登录方式一样,只是多了tenant参数.本篇将介绍在Abp vNext授权服务中启用多租户 ...
- 触发器修改后保存之前的数据 表中插入数据时ID自动增长
create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...
- ABP使用Nginx代理导致租户ID(Abp.TenantId)丢失
描述:ABP使用Nginx代理导致租户ID(Abp.TenantId)丢失,自定义header无效无法传递,导致租户选择认证失败.原因是因为 Nginx 过滤是“.”这符号. 解决: 1,先从代码人手 ...
- 初识ABP vNext(7):vue身份认证管理&租户管理
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 按钮级权限 身份认证管理 R/U权限 权限刷新 租户管理 租户切换 效果 最后 前言 上一篇介绍了vue+ABP国际化 ...
- ABP vNext 自动注入,暗藏天坑如斯
导言 我们在使用ABP vNext框架时,都知道该框架为我们实现了自动依赖注入(实现自动注入需要在项目里面创建Module类,并且将Module类上的DependsOn到相应的启动Module类或调用 ...
随机推荐
- Spark性能调优篇二之重构RDD架构及RDD持久化
如果一个RDD在两个地方用到,就持久化他.不然第二次用到他时,会再次计算. 直接调用cache()或者presist()方法对指定的RDD进行缓存(持久化)操作,同时在方法中指定缓存的策略. 原文:h ...
- Spring Data JPA 整合Spring 第二篇
主要是在CustomerDao中去写一些代码,在调用Query中去用SQL 例如 public interface CustomerDao extends JpaRepository<Custo ...
- Git 使用中遇见的各种问题及解决办法
一.修改提交代码的用户名以及提交邮箱,(推荐使用方法2,一劳永逸) 方法1(修改.git/config文件): step1:进入工程.git文件夹 step2:vim config step3:末行添 ...
- Selenium ActionChains、TouchAction方法
ActionChains和TouchAction可以用来模拟点击.双击.滑动等事件.ActionChains用于执行PC端的鼠标移动.按键.拖拽等事件:TouchActions用法与ActionCha ...
- springMVC框架配置定时器
在springmvc.xml添加如下内容在xmlns中添加 xmlns:task="http://www.springframework.org/schema/task"1在xsi ...
- [LeetCode]172. Factorial Trailing Zeroes阶乘尾随0的个数
所有的0都是有2和45相乘得'到的,而在1-n中,2的个数是比5多的,所以找5的个数就行 但是不要忘了25中包含两个5,125中包含3个5,以此类推 所以在找完1-n中先找5,再找25,再找125.. ...
- [LeetCode]547. Friend Circles朋友圈数量--不相邻子图问题
/* 思路就是遍历所有人,对于每一个人,寻找他的好友,找到好友后再找这个好友的好友 ,这样深度优先遍历下去,设置一个flag记录是否已经遍历了这个人. 其实dfs真正有用的是flag这个变量,因为如果 ...
- java键盘输入方法-
字符串缓冲方式 BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); String line = null ...
- 30天自制操作系统-day1
30天自制操作系统(linux环境)--第一天 我是在CentOS的环境上面实现的,使用ubuntu的环境也是类似的 第一步:因为要对二进制文件进行编辑,所以安装二进制编辑器hexedit(当然其他的 ...
- 一文教你轻松搞定ANR异常捕获与分析方法
1. ANR 产生原理 关于 ANR 的触发原因,Android 官方开发者文档中 "What Triggers ANR?" 有介绍,如下: Generally, the syst ...