0

长话短说……我有一个类(在我的示例场景中是一个应用程序页面),它包含对 SPList 的引用。

public partial class ApplicationPage1 : LayoutsPageBase
{
    private static SPList _list = GetSPList();

    private static SPList GetSPList()
    {
        try
        {
            return SPContext.Current.Web.GetList("/Lists/CoreConfiguration");
        }
        catch (FileNotFoundException)
        {
            return null;
        }
    }

    protected void BtnRunQuery_OnClick(object sender, EventArgs e)
    {
        Debug.WriteLine(_list.Author.Name);
    }
}

有趣的部分显然是按钮单击事件。因为第一次它总是有效的。也许如果你幸运的话,它会第二次或第三次起作用。但它几乎不会在第四次运行时抛出 NullReferenceException。引发异常的不是列表本身,而是类的一些成员。显然,SPList 对象是死的多于生的。

因此,显然持有对 SPList 的引用并不是一个好主意。这里要遵循的设计模式是每次都去获取列表吗?在每个请求上?

4

1 回答 1

1

不,在字段中保存SPList实例并不是最好的主意。static事实上,你可能不会那样做。正如SPContext.Current它的名字所表明的,它是非常具体的时间点的当前上下文。简而言之(和简化),它是特定于请求的,并且SPList实例也是如此。

SPList每次需要时都必须检索一个新实例。在内部,它绑定到SPWeb实例,对此它是相同的——它无法在请求中生存。SPList这里的经验法则是:如果您只有一个静态实例,您将如何区分不同用户的权限?


旁注:它适用于第一个请求的原因很简单:你的类在第一次使用时被 CLR 初始化,这显然是在第一个请求期间。然后 CRL 调用类的静态构造函数,它计算静态成员的值,并且由于SPContext.Current当时有效,它可以工作。

于 2013-11-12T17:08:04.307 回答