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

原文地址:https://www.cnblogs.com/niecx/p/11651398.html

时间: 2024-10-10 05:44:28

Abp vNext抽茧剥丝01 使用using临时更改当前租户的相关文章

Unreal4(虚幻4抽茧剥丝)——01章初窥Unreal以及准备工作

本章内容有点老生常谈,而且很多以前的朋友,同事写的博文都具有这一章,曾经打算直接略过,但是如果没有这一章内容,本系列将不具备完整性,和可参看性!为了让只看该系列人的人能大致了解UE4的开发方法,所以本系列也加入了这一章节,为了让大家尽快,尽可能给早点接触到实质内容,本章尽量做到言简意赅.尽量把其他博文里几个章节的内容整合成一个,这么做的目的就是为了让大家只需要参看本章一章内容就能快速做好准备工作.开始实际内容的学习.那么好我们开始吧 首先说一句废话:UE4自发布以来,在行业内引起了轩然大波,这不

Unreal4(虚幻4抽茧剥丝)——00章开卷语

大家好,Unreal4自从推出到现在已经2个月有余,本人有幸参加过2个Unreal3项目,Unreal的这次重大升级对于我们这些老用户来说绝对是一场饕餮盛宴,要学的东西很多!很多制作思路都变了!但无奈本人现阶段在一个非Unreal项目中无法自拔.学习进度缓慢.并且由于项目进入关键时期,导致学习时间被冲得七零八落的.笔记也记得东一块,西一块的也没有个合适地方整理,所以在此打算借博客园宝地对自己的学习过程进行一个记录.还有希望能整理一套深入浅出的教程.这样能让有兴趣学习的人有个入门参考.那也为吾之幸

Unreal4(虚幻4抽茧剥丝)——03章从生成代码入手

本章开始我们进入Unreal4正统的学习阶段 首先我们打开Unreal系统工程 运行Unreal4,新建工程 选择TP_FirstPerson C++版本(笔者的向导提示FirstPerson已经存在,因为工程已经预先创建了,请读者忽略),点击创建项目,工程向导将为您自动创建一个第一人称射击游戏的架子.并询问是否打开C++工程,在这里我们选是即可 工程打开后如图所示,并且对UnrealEngine的源代码工程进行了关联. Engine目录关联到了所下载的引擎源代码,至于Programs中的一些项

ABP vNext

一.简要介绍# ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 8 月 20 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.19.0,可以尝试用于生产环境.新的 ABP vNext 框架完全是基于 ASP .NET Core 进行开发,其完全模块化的组件库能够让开发人员拥有更多的选择空间. ABP vNext 框架核心库比 ABP 框架更加精简,因为将原有许多的组件从其核心库抽离成独立的组件.这样开发人员可以更加灵活的选择自己需要的功能进行集成

ABP vNext模块系统初试 - 创建留言板模块

上次翻译的ABP vNext介绍发布后,引起了很多ABP好爱者的关注. 那么就趁热打铁,体验一下新ABP. 新的ABP中我最感兴趣的是它的模板系统,所以这次就利用模块系统做了留言板的例子,分享给大家. 留言板模块 我们的留言板模块功能很简单,就是提供用户留言的功能(废话),为了简单起见,功能都非常简陋: 通过菜单进入留言板 显示留言一览,显示的项目有:标题,作者和时间 任意用户可创建留言,修改或删除自己的留言 管理员可修改或删除任何留言 留言只有标题和正文,均为纯文本(不支持富文本). 使用AB

用abp vNext快速开发Quartz.NET定时任务管理界面

今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码我会上传到github上,有兴趣的小伙伴可以在文章底部查看源码链接. 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10444060.html 写在前面 有几天没更新博客了,一方面因为比较忙,另一方面是因为最近在准备组织我们霸都合肥的.NET技术社区首次

给 ABP vNext 应用安装私信模块

在上一节五分钟完成 ABP vNext 通讯录 App 开发 中,我们用完成了通讯录 App 的基础开发. 这本章节,我们会给通讯录 App 安装私信模块,使不同用户能够通过相互发送消息,并接收新私信的通知.在章节的最后,笔者将演示模块的"改装",实现禁止用户发私信给自己的定制化需求. 什么是"模块"? 使用 Abp 框架,你可以提前制作一些功能模块,例如微信登录.私信.博客.论坛等模块,将它们打包备用.在开发具体的 App 应用时,你可以轻松将模块安装到你的工程中

abp vNext 使用Mysql 数据库

1. 环境 编译器 vs2019 运行时 dotnet core  2.2 数据库 Mysql 5.8 2. 开发准备 使用abp 官方提供的 CLI工具 创建时因为网络原因会连接失败,幸好abp中文网有对应的国内CLI工具,在此感谢~ 安装 CLI dotnet tool install -g Cn.Abp.Cli 如果之前安装过,更新可以使用: dotnet tool update -g Cn.Abp.Cli 3. 创建项目 根据官方示例,创建一个Acme.BookStore项目 cnabp

Abp vnext 使用sql2005、sql2008等脚本报错解决

Startup.cs文件,在ConfigureServices方法中加入以下代码 services.Configure<AbpDbContextOptions>(options => { options.UseSqlServer(b => b.UseRowNumberForPaging()); }); 原文地址:https://www.cnblogs.com/HUGO_CM/p/10888910.html