SPSite site = новый SPSite (SPContext.Current.Web.Url) против SPContext.Current.Web.Site - PullRequest
15 голосов
/ 08 ноября 2011

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

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

, а не просто?

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

Обновление

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

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

Ответы [ 3 ]

11 голосов
/ 08 ноября 2011

Взгляните на документацию с рекомендациями по удалению объектов в 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 без утилизации.

4 голосов
/ 08 ноября 2011

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

0 голосов
/ 24 октября 2015

Денис Г правильный. Утилизация SPSite / SPWeb / etc важна, но убедитесь, что вы не утилизируете объекты, предоставленные вам 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
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...