关于C#:ASP.NET中静态内部类的范围

Scope of static inner class in ASP.NET

我不确定非静态类的一个静态内部类的范围。

在下面的几行中,变量dataContextCreator.Instance(单件模式的一部分)是指向所有页面对象/页面请求的同一pDataContext实例,还是每个对象都有自己的实例?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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(正如我所做的那样)会起作用。

谢谢!

编辑:这是我的解决方案,我现在有相同的延迟加载能力,但没有静态变量。在这种情况下,我不需要在保持变量周围放置互斥锁。

1
2
3
4
5
6
7
8
9
10
11
12
    private PDataContext _DataContext;
    private PDataContext DataContext
    {
        get
        {
            if (this._DataContext == null)
            {
                this._DataContext = new PDataContext(TUtil.GetConnectionString());
            }
            return this._DataContext;
        }
    }


每一页都是一样的。静态变量是一个静态变量,但它是嵌套的。(泛型使事情变得"有趣",因为Foo中的静态变量与Foo中的静态变量是分开的,但在这里不相关。)

如果要使某个对象依赖于EDOCX1的实例(2),它需要是Page中的实例变量。(顺便说一下,我建议不要将一个案例命名为它的基类。)


由于Instance变量是静态的,所以它只存在一次,因此所有线程共享相同的值。将变量放入另一个类中不会改变静态变量的工作方式。

要使单个实例成为页面实例的本地实例,您需要将引用存储在页面上下文中:

1
2
3
4
5
6
7
8
9
10
public PDataContext DataContext {
   get {
      PDataContext result = HttpContext.Current["PData"];
      if (result == null) {
         result = new PDataContext(TUtil.GetConnectionString());
         HttpContext.Current["PData"] = result;
      }
      return result;
   }
}


嵌套类纯粹是为了方便命名(以及一些修改器更改(私有等))。在行为方面,它们实际上与常规(顶级)类是相同的。所以Instance是完全共享的(它不绑定到页面实例)。