长话短说...我有一个类(在我的示例场景中它是一个应用程序页面),其中包含对 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);
}
}
有趣的是按钮点击事件显然。因为第一次它总是有效。也许如果你幸运的话,它可以第二次或第三次工作。但它几乎从不工作第 4 次,此时它会抛出 NullReferenceException。抛出异常的不是列表本身,而是类的一些成员。显然,SPList对象比活的更死。
因此,显然保留对SPList的引用不是一个好主意。设计模式是否每次都遵循此处并获取列表?在每个请求上?
不,在static
字段中保存SPList
实例并不是最好的主意。事实上,你可能不会那样做。正如SPContext.Current
的名字所表明的,它是非常特定的时间点的当前上下文。简而言之(简化),它是特定于请求的,SPList
实例也是如此。
每次需要时,都必须检索新的SPList
实例。在内部,它绑定到SPWeb
实例,对于它是一样的 - 它无法在请求中生存。这里的经验法则是:如果您只有一个静态SPList
实例,您将如何区分不同用户的权限?
旁注:它适用于第一个请求的原因很简单:您的类在第一次使用时由 CLR 初始化,这显然是在第一个请求期间。然后,CRL 调用类的静态构造函数,该构造函数计算静态成员的值,并且由于SPContext.Current
在当时有效,因此它可以正常工作。