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
}
}
});