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包)开发的.因此,它的 ... 
随机推荐
- Xamarin.FormsShell基础教程(6)Shell项目内容详情页面
			Xamarin.FormsShell基础教程(6)Shell项目内容详情页面 轻拍内容列表页面中的任意一项内容后,进入内容详情页面,如图1.6和图1.7所示.该页面中显示了内容项的标题和具体内容.该页 ... 
- pycharm把制表符(tab)转换为空格(PEP8)
			pycharm把制表符转换为4个空格 pycharm显示空格 
- Vue ElementUI主页面搭建和导航栏使用,并在刷新页面的时候选中状态消失的问题解决
			<template> <div style="height:100%;width: 100%; padding:0 auto; margin: 0 auto;"& ... 
- 码云push时提示 DeployKey does not support push code fatal: Could not read from remote repository.
			一.如果需要push代码到码云,需要创建个人公钥,公共公钥只可以读不可以修改 二.执行代码即可:git push 
- WebGL学习笔记(十六):遮罩
			这里总结下几种WebGL中实现遮罩的方法. 模板缓冲 模板缓冲可以实现渲染剔除,但是我们之前的学习里,剔除范围是基于上一次渲染的结果,且上一次的渲染也会进行显示,这样的话并不适合用来实现遮罩. 我们想 ... 
- 012-MySQL 索引添加以及优化说明
			一.索引概述 数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度. 如果查询语句使用索引(通常是wher ... 
- Python - Django - 中间件 process_exception
			process_exception(self, request, exception) 函数有两个参数,exception 是视图函数异常产生的 Exception 对象 process_except ... 
- 工控随笔_25_西门子TIA 博图V14.SP1安装报错,授权错误
			前面有一篇文章说过西门子的软件安装的时候太麻烦,很容易出现错误. 但是有些错误在安装的时候却没有关系,例如下面的错误. 如上图所示,安装已经到最后一步,总结前面的修改系统组态已经打勾(✔) ,而且提示 ... 
- Content-Type四种常见取值
			一.application/x-www-form-urlencoded 最常见 POST 提交数据的方式.浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 applica ... 
- Spring  AOP的常用方法
			转 https://blog.csdn.net/u014745069/article/details/84887765 
