取消

临时替换上下文

今天在看Abp源码的时候偶然看到一段临时修改当前上下文语言的的方式,我想是不是其他的地方也可以这样,比如在多租户系统,临时要用到超级权限不使用租户模式,怎么快速切换当前上下文,使用完又改回去。


代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// This class can be used to provide an action when
/// Dipose method is called.
/// </summary>
public class DisposeAction : IDisposable
{
    private readonly Action _action;

    /// <summary>
    /// Creates a new <see cref="DisposeAction"/> object.
    /// </summary>
    /// <param name="action">Action to be executed when this object is disposed.</param>
    public DisposeAction([NotNull] Action action)
    {
        Check.NotNull(action, nameof(action));

        _action = action;
    }

    public void Dispose()
    {
        _action();
    }
}
public static class CultureHelper
{
    public static IDisposable Use([NotNull] string culture, string uiCulture = null)
    {
        Check.NotNull(culture, nameof(culture));

        return Use(new CultureInfo(culture), uiCulture == null ? null : new CultureInfo(uiCulture));
    }

    public static IDisposable Use([NotNull] CultureInfo culture, CultureInfo uiCulture = null)
    {
        Check.NotNull(culture, nameof(culture));

        var currentCulture = CultureInfo.CurrentCulture;
        var currentUiCulture = CultureInfo.CurrentUICulture;

        CultureInfo.CurrentCulture = culture;
        CultureInfo.CurrentUICulture = uiCulture ?? culture;

        return new DisposeAction(() =>
        {
            CultureInfo.CurrentCulture = currentCulture;
            CultureInfo.CurrentUICulture = currentUiCulture;
        });
    }
}

就可以用

1
2
3
4
5
using(var ci=CultureHelper.Use(xxx))
{
    //修改了上下文的语言环境
}
//自动恢复语言环境,这样就避免了手动还原语言环境

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/%E4%B8%B4%E6%97%B6%E6%9B%BF%E6%8D%A2%E4%B8%8A%E4%B8%8B%E6%96%87 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论