所以问题来了:有什么方法可以创建一个只共享一部分代码的上下文。我真的不知道怎么解释,所以我会举个例子。
假设我有:
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/