Abp vNext抽茧剥丝01 使用using临时更改当前租户
在Abp vNext中,如果开启了多租户功能,在业务代码中默认使用当前租户的数据,如果我们需要更改当前租户,可以使用下面的方法
/*
此时当前租户
*/
using (CurrentTenant.Change(tenantId)) {
/*
此时为租户 tenantId
*/
}
/*
此时为当前租户
*/
那上面这种在using中临时更改租户是怎样实现的呢,通过看源码然后自己整理了一下,简化版如下
/// <summary>
/// 当Dispose方法被调用时 这个类可执行一个方法
/// </summary>
public class DisposeAction : IDisposable
{
private readonly Action _action;
/// <summary>
/// 创建一个 <see cref="DisposeAction"/> 对象.
/// </summary>
/// <param name="action">当此对象被释放时 要执行的方法</param>
public DisposeAction(Action action)
{
if (action == null) throw new ArgumentNullException(nameof(action));
_action = action;
}
public void Dispose()
{
_action();
}
}
/// <summary>
/// 当前租户
/// </summary>
public class CurrentTenant
{
public CurrentTenant()
{
Id = 1;
}
/// <summary>
/// 租户Id
/// </summary>
public int Id
{
get;
private set;
}
/// <summary>
/// 更改当前租户Id
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public IDisposable Change(int id)
{
var currentID = Id; // 保存原来的租户id
Id = id; // 设置为新的租户id
return new DisposeAction(() => // 当DisposeAction对象被释放时 恢复原来的租户id
{
Id = currentID;
});
}
}
class Program
{
static void Main(string[] args)
{
CurrentTenant currentTenant = new CurrentTenant();
Console.WriteLine($"using之前 当前租户id为 { currentTenant.Id }");
using (currentTenant.Change(2))
{
Console.WriteLine($"using内部 当前租户id为 { currentTenant.Id }");
}
Console.WriteLine($"using之后 当前租户id为 { currentTenant.Id }");
Console.ReadLine();
}
}
结果为:
using之前 当前租户id为 1
using内部 当前租户id为 2
using之后 当前租户id为 1
Abp vNext抽茧剥丝01 使用using临时更改当前租户的更多相关文章
- [Abp vNext 源码分析] - 文章目录
一.简要介绍 ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 2 月 18 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.16.0 ,但还属于预览版 ...
- ABP vNext
一.简要介绍# ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 8 月 20 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.19.0,可以尝试用于生 ...
- 五分钟完成 ABP vNext 通讯录 App 开发
五分钟完成 ABP vNext 通讯录 App 开发 ABP vNext(后文简称Abp)是 Volo 公司堪称艺术品级的应用开发框架,它基于领域驱动设计(DDD)的思维,创新地采用了模块化的设计.A ...
- ABP VNext从单体切换到微服务
注:此处的微服务只考虑服务部分,不考虑内外层网关.认证等. ABP VNext从单体切换到微服务,提供了相当大的便利性,对于各模块内部不要做任何调整,仅需要调整承载体即可. ABP can help ...
- 学习abp vnext框架到精简到我的Vop框架
学习目标 框架特点 基于.NET 5平台开发 模块化系统 极少依赖 极易扩展 ....... 框架目的 学习.NET 5平台 学习abp vnext 上图大部分功能已经实现,多数是参考(copy)ab ...
- 源码解析-Abp vNext丨LocalEventBus
前言 基础篇已经更新完了,从本篇开始我们进入,中级篇(学习部分源代码)我会挑一些我个人认为比较重要的知识点结合部分开源项目进行源码讲解,咱们废话不说直接上车. Abp vNext的事件总线分2种,一种 ...
- Abp VNext分表分库,拒绝手动,我们要happy coding
Abp VNext 分表分库 ShardingCore ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本, ...
- Abp Vnext源码解析系列文章01---EventBus
一.简介 BP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装了一个 ...
- ABP vNext系列文章03---依赖注入
一.依赖注入的类型注册 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的.因此,它的 ...
随机推荐
- Spark连续特征转化成离散特征
当数据量很大的时候,分类任务通常使用[离散特征+LR]集成[连续特征+xgboost],如果把连续特征加入到LR.决策树中,容易造成overfit. 如果想用上连续型特征,使用集成学习集成多种算法是一 ...
- MySQL数据类型:UNSIGNED注意事项(转)
原文地址:https://www.cnblogs.com/blankqdb/archive/2012/11/03/blank_qdb.html 1. UNSIGNED UNSIGNED属性就是将数字类 ...
- Linux(CentOS)启动时自动执行脚本(rc.local)
一.Linux开机启动有多种方法,比如我设置mysql开机启动为:chkconfig --level 35 mysqld on 二.下面说说通过rc.local文件进行开机启动: 1.首先创建一个启动 ...
- DLL注入实践
Windows系统大量使用dll作为组件复用,应用程序也会通过dll实现功能模块的拆分.DLL注入技术是向一个正在运行的进程插入自有DLL的过程. Window下的代码注入 常见的Windows代码注 ...
- 在nginx环境下搭建https服务,代理到本地web项目
安装过程略. 1.证书准备 本地调试,可以安装自签名证书,安装方法参考https本地自签名证书添加到信任证书访问 2.修改配置文件 将上面的配置文件拷贝到conf目录,添加或者修改节点如下 http{ ...
- ng2 空标签
<ng-container *ngIf="v.products"> <li class="clearfix" *ngFor="let ...
- Spring boot启动成功后输出提示
添加logback-spring.xml,将log输出到文件,控制台输出的level改为error因此只会出处banner src/main/resources/banner.txt的内容为 star ...
- (转)IntelliJ IDEA 插件 阿里巴巴Java开发手册(Alibaba Java Coding Guidelines)
背景:idea安装插件,学习使用阿里巴巴开发插件. 在线和离线的安装方式. IntelliJ IDEA 插件 阿里巴巴Java开发手册(Alibaba Java Coding Guidelines) ...
- 第三节:一些指令总结(Nuget、)
一. NuGet 1. 获取当前项目已经安装的类库:Get-Package 2. 安装指定版本:install-package <程序包名> -version <版本号> 3. ...
- Linux nfs服务讲解
nfs服务介绍 nfs(Network File System) 网络文件系统,能使用户访问服务器的文件系统,就像访问自己的本机的文件系统一样,并且多个 客户端共享访问该文件系统. 目前nfs服务,较 ...