SPSite site = new SPSite(SPContext.Current.Web.Url)vs SPContext.Current.Web.Site

时间:2011-11-08 14:45:49

标签: sharepoint sharepoint-2010

为什么有些SharePoint示例使用

using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
    ...
}

而不仅仅是简单?

SPSite site = SPContext.Current.Web.Site;
...

更新

我想我已将问题缩小到以下几个方面:

似乎我不应该直接使用SPContent.Current,除非我确定,我的代码在SharePoint中运行。但什么时候不是真的?

3 个答案:

答案 0 :(得分:11)

请查看Microsoft的disposing objects in SharePoint 2010最佳做法文档,但有opposing views

SharePoint项目有几个关键要点:

  • 始终处理您的 SPWeb / SPSite对象 - >内存泄漏
  • 当您确定代码在SharePoint上下文中运行时,请使用SPContext.Current ...
    • 单元测试意味着没有Sharepoint上下文
    • 外部实用程序意味着没有Sharepoint上下文
    • Powershell表示没有SharePoint上下文(例如,激活功能接收器功能可能会失败)
  • 不要处置SPContext.Current ...但是要创建自己的对象(再次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
    }
  }
});