我不确定非静态类的一个静态内部类的范围。
在下面的行中,变量DataContextCreator.Instance(Singleton模式的一部分)是指向所有Page对象/页面请求的相同PDataContext实例,还是每个对象都有自己的实例?
public class Page : System.Web.UI.Page
{
private class DataContextCreator
{
static DataContextCreator() { }
public static readonly PDataContext Instance = new PDataContext(TUtil.GetConnectionString());
}
public PDataContext DataContext
{
get
{
return DataContextCreator.Instance;
}
}
}
我是否必须使用HttpContext.Current才能以所需的方式工作,即没有共享的DataContext?如果是这样,还有另一种方式吗?
我不确定是否将静态类修改为私有(就像我所做的那样)可以解决问题。
谢谢!
编辑: 这是我的解决方案,我现在具有相同的延迟加载功能但没有静态变量。在这种情况下,我认为我不需要在保持变量周围加一个互斥锁。
private PDataContext _DataContext;
private PDataContext DataContext
{
get
{
if (this._DataContext == null)
{
this._DataContext = new PDataContext(TUtil.GetConnectionString());
}
return this._DataContext;
}
}
答案 0 :(得分:2)
每页都是一样的。静态变量是一个静态变量,但是它是嵌套的。 (泛型使事情“有趣”,因为Foo<int>
中的静态变量与Foo<string>
等中的静态变量是分开的,但这与此处无关。)
如果你想根据Page
的实例做出某些事情,那么它必须是Page
中的实例变量。 (顺便说一句,我建议不要将案例命名为基类。)
答案 1 :(得分:1)
嵌套类纯粹是为了方便命名(以及一些修饰符更改(私有等))。在行为方面,它们实际上与常规(顶级)类相同。所以Instance
完全共享(它不与Page实例绑定)。
答案 2 :(得分:1)
由于Instance
变量是静态的,它只存在一次,因此所有线程共享相同的值。将变量放在另一个类中不会改变静态变量的工作方式。
要创建页面实例本地的单例,您可以将引用存储在页面上下文中:
public PDataContext DataContext {
get {
PDataContext result = HttpContext.Current["PData"];
if (result == null) {
result = new PDataContext(TUtil.GetConnectionString());
HttpContext.Current["PData"] = result;
}
return result;
}
}