SPSite site = новый SPSite (SPContext.Current.Web.Url) и SPContext.Current.Web.Site

Почему некоторые примеры SharePoint используют

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

а не просто?

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

Обновление

Я думаю, что я сузил вопрос до следующего:

Кажется, что я не должен использовать SPContent.Current напрямую, если не уверен, что мой код работает внутри SharePoint. Но когда это не будет правдой?

Ответы

Ответ 1

Взгляните на документацию по лучшим практикам удаление объектов в SharePoint 2010 от Microsoft, однако есть противоположные представления.

Есть несколько ключевых выходов для проектов SharePoint:

  • Всегда удаляйте свои объекты SPWeb/SPSite → утечки памяти
  • Использовать SPContext.Current..., когда вы уверены, что ваш код работает в контексте SharePoint
    • Единичные тесты означают отсутствие контекста Sharepoint
    • Внешние утилиты не означают контекст Sharepoint
    • Powershell означает отсутствие контекста SharePoint (например, активация функции с приемником функций может завершиться с ошибкой)
  • Не удаляйте SPContext.Current... но создайте свой собственный объект (снова using)

У вас может быть проблемы с согласованностью с несколькими объектами SP..

В конце концов, SPSite site = SPContext.Current.Web.Site; в некоторых случаях прекрасен, но вы не контролируете этот объект site - это может быть проблемой. Если вы идете на new SPSite(...), у вас всегда будет ваш SPSite, а не то, что SharePoint создал и управлял для вас.

Лично я почти всегда иду за структурой using, чтобы потом все объекты были расположены правильно. В качестве альтернативы я использую SPContext.Current.Web без утилизации.

Ответ 2

Это зависит от контекста, в котором работает ваш код. Например, вам нужно создать новый экземпляр SPSite, если вы работаете в блоке RunWithElevatedPrivileges.

Ответ 3

Деннис Г. прав. Устранение SPSite/SPWeb/и т.д. Важно, но убедитесь, что вы не располагаете объектами, которые предоставляются вам API напрямую. Это тонкий, но критический, иначе ваш ответ никогда не будет сгенерирован или не приведет к возникновению ситуаций прерывания потока. По моему опыту, если мне нужна быстрая информация о SPSite или SPWeb, я уверен, что это доступно для пользовательского контекста (либо авторизованного пользователя, либо анонимного), а с помощью объекта SPContext.Current. * Отлично. В противном случае используйте метод RunWithElevatedPriveleges, чтобы обернуть свой код и внутри этого лямбда имеет следующий шаблон:

SPSecurity.RunWithElevatedPrivileges(() =>
{
  using (SPSite site = new SPSite(SPContext.Current.Site.ID))
  {
    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID))
    {
     // stuff goes here elevated
    }
  }
});