为什么有些SharePoint示例使用
using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
...
}
而不仅仅是简单?
SPSite site = SPContext.Current.Web.Site;
...
更新
我想我已将问题缩小到以下几个方面:
似乎我不应该直接使用SPContent.Current
,除非我确定,我的代码在SharePoint中运行。但什么时候不是真的?
答案 0 :(得分:11)
请查看Microsoft的disposing objects in SharePoint 2010最佳做法文档,但有opposing views。
SharePoint项目有几个关键要点:
using
)您的多个SP ..对象可能有problems with consistency。
最后SPSite site = SPContext.Current.Web.Site;
在某些情况下很好,但你无法控制这个site
对象 - 这可能是问题所在。如果您选择new SPSite(...)
,您将始终拥有您的 SPSite
,而不是SharePoint为您创建和管理的内容。
就个人而言,我几乎总是选择using
结构,以便之后所有对象都正确处理。或者,我使用SPContext.Current.Web
而不进行处置。
答案 1 :(得分:4)
这取决于代码运行的上下文。例如,如果您在SPSite
块中运行,则需要创建新的RunWithElevatedPrivileges
实例。
答案 2 :(得分:0)
Dennis G是对的。处置SPSite / SPWeb / etc很重要,但请确保不要直接处置API提供给您的对象。它很微妙但很关键,否则你的响应将永远不会生成或导致线程中止的情况。 根据我的经验,如果我需要有关用户上下文(内容管理员授权用户或匿名用户)可用的SPSite或SPWeb属性的快速信息,那么使用SPContext.Current。*对象非常棒。否则,使用 RunWithElevatedPriveleges 方法来包装代码,并且lambda内部具有以下模式:
SPSecurity.RunWithElevatedPrivileges(() =>
{
using (SPSite site = new SPSite(SPContext.Current.Site.ID))
{
using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
{
// stuff goes here elevated
}
}
});