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类或调用 ...
随机推荐
- 仵航说 SpringBoot项目配置Log日志服务-仵老大
今天领导让我配置一个log日志服务,我哪里见过哟,然后就去百度了,结果挨个试下去,找到了一个能用的,分享给大家 大致四个地方 分别是 1.pom文件需要引入依赖 2.创建一个TestLog类 3.在y ...
- eclipse 创建自己的Maven项目(超详细)
本文章 主要是 讲解 是讲解 eclipse创建项目 --SpiritMark_liu 先配置 Maven 的 settings 地址 (Window -> Perferences–>Ma ...
- 【windows】【消息中间件】【安装】Elasticsearch
一.准备工作 elasticsearch的下载地址:https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址:https://githu ...
- CentOS 8 部署 ASP.NET Core 3.1 应用程序 kestrel+Nginx IIS+kestrel
vs2019发布到IIS 下载文档https://files.cnblogs.com/files/netlock/%E4%BD%BF%E7%94%A8VS2019%E5%8F%91%E5%B8%83 ...
- HTTP Error 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。
将submit改成button即可 因为触发了form表单
- 二、LINUX文本处理三剑客之grep
1. grep一般格式:grep [选项] 基本正则表达式 [文件],其中基本正则表达式需要用引号引起来 引号引起来的作用:a.防止被误解为shell命令,b.可以用来查找多个单词组成的字符串 gre ...
- java中将信息写入excel
//实体类 package com.cn.peitest.excel; import java.io.Serializable; /** * 员工基本信息 * * @author pei */ pub ...
- Spring Cloud Config应用篇(九)
一.SpringCloud Config 配置中心 1.1.配置中心说明 SpringCloud Config 服务器以下简称"配置中心". Spring Cloud Config ...
- Stata极简生存分析
1. 导入数据 webuse drugtr,clear *webuse -- Use dataset from Stata website stset,clear *上一行命令导入进来的数据是&quo ...
- tep0.6.0更新聊聊pytest变量接口用例3个级别复用
tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地.fixture是pytest核心技术,本文聊聊如何使用fixtu ...