短篇小说真正简短...我有一个类(在我的示例场景中它是一个应用程序页面),它包含对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的引用并不是一个好主意。 是否遵循设计模式,每次都去获取列表?在每个请求?
答案 0 :(得分:1)
不,在SPList
字段中保留static
个实例并不是最好的主意。事实上,你可能不这样做。正如SPContext.Current
的名称所示,它是非常具体的时间点的当前上下文。简而言之(简化),它是特定于请求的,并且SPList
实例也是如此。
每次需要时都必须检索一个新的SPList
实例。在内部,它与SPWeb
实例绑定,对于它来说它是相同的 - 它不能在请求中存活。这里的经验法则是:如果您只有一个静态SPList
实例,您将如何区分不同用户的权限?
旁注:它为第一个请求起作用的原因很简单:当第一次使用时,CLR会初始化您的类,这显然是在第一个请求期间。然后CRL调用class'es静态构造函数,它计算静态成员的值,并且由于SPContext.Current
在那时是有效的,所以它接缝起作用。