c# - 为部分代码创建上下文

标签 c# session

所以问题来了:有什么方法可以创建一个只共享一部分代码的上下文。我真的不知道怎么解释,所以我会举个例子。

假设我有:

using(Context ctx = new Context())
{
    ctx.Set("abc","abc");
    method1();
    method2();
}

和(与方法 2 相同):

public void method1()
{
    Context ctx = Context.Instance();
    string abc = ctx.Get("abc");
}

目标是方法中的 Context.Instance() 返回在使用中创建的对象,但它必须保持线程安全。我的意思是,如果调用是从 using 外部进行的,或者同时在另一个 using 内部进行,它将根据 using 返回上下文。并且 Context.Instante() 将返回一个新的 Context 如果不存在(或 null,我会在之后进行调整,这不是重点)。

我知道这不是经典的做法,但我不想在每次调用时都传递上下文。真正的方法会有很多子方法,只有最后一个需要它,但它必须从一开始就通用。

目标是创建一个将共享给所有(且仅)子方法的事务,但顶级方法无权访问 EF 类。我唯一的解决方案是使用 session 来存储我的 EF 上下文,或者在批处理中使用静态,因为它们没有 session 。这是我的目标,但问题更为普遍。

我希望我说的很清楚,不要犹豫,问问题。并添加标签,因为我真的不知道标签添加了什么。

谢谢!

编辑

我可能还不够清楚。单例是不够的,静态在所有实例之间共享。如果两个不同的用户同时调用 using ,上下文对他们来说是相同的,但我希望他们不同。

理想情况下,我希望允许这样的事情:

using(Context ctx = new Context())
{
    ctx.Set("abc","abc");
    method1();
    using(Context ctx = new Context())
    {
        ctx.Set("abc","def");
        method2();
    }
    method1();
}

但我觉得我要求太多了。

最佳答案

让您的 Context.Instance() 方法管理 thread static多变的。第一个调用可以创建实例,其他调用可以使用它,并且在第一个调用结束时销毁它。

使用线程静态方法,不会出现多线程问题,因为每个线程都有自己的实例。在单个线程中,每个“下一个方法执行”都将使用相同的实例。

更新:

一些代码。如果我调试它,只会创建一个上下文,第二个 using 语句接收与第一个 using 语句相同的上下文。

class Context : IDisposable {
    [ThreadStatic]
    private static Context _instance;
    [ThreadStatic]
    private static int _instanceCounter;

    public static Context Instance() {
        if (_instanceCounter == 0) {
            _instance = new Context();
        }
        _instanceCounter++;
        return _instance;
    }

    private static void Release() {
        _instanceCounter--;
        if (_instanceCounter == 0) {
            if (_instance != null)
                _instance.Dispose();
            _instance = null;
        }
    }

    public void Dispose() {
        Release();
    }
}

public class Test {
    public void Test1() {
        using (var context = Context.Instance()) {
            // do something
            Test2();
        }
    }

    private void Test2() {
        using (var context = Context.Instance()) {
            // identical context as in Test1
            // do something
        }
    }
}

关于c# - 为部分代码创建上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12055702/

相关文章:

c# - html 表单发布到 mvc Controller

javascript - Laravel Sessions 与 jQuery 可以在 PC 浏览器上工作,但不能在 Android 上工作?

java - 如何定义DefaultListableBeanFactory的序列化id?

c# - 无法使附加到实体的 ODATA v4 操作起作用

c# - 在vb.net或c#中将curl转换为webrequest

c# - List.Add() 线程安全

c# - .net 对象大小填充?

session - 即使超时设置为 1 小时,Google Analytics session 也会超时?

php - 我不能在一页中显示两条 session 消息吗

session - 如何在一段时间不活动后自动注销用户?