Нужно ли утилизировать объекты SPWeb (в общем)? - PullRequest
2 голосов
/ 15 марта 2011

Если вы запустите SharePoint и узнаете об утилизации SPSite и SPWeb, почти все предлагают использовать конструкцию «using», если вы работаете с новыми экземплярами SPSite и SPWeb.

using (SPSite s = new SPSite("http://yourserver")
{
    using (SPWeb web = s.OpenWeb("http://yourweb")
    {
         // do fancy stuff here
    }
}

Я тоже так делал. Однако, если вы посмотрите на метод SPSite.Dispose () , вы заметите, что SPSite сохраняет ссылку на свои SPWebs, созданные SPSite.OpenWeb () . На SPSite.Dispose () все SPWebs, связанные с этим SPSite, подвергаются дипозированию. Я думаю (но я не уверен), что практически все методы, которые создают новый SPWeb, добавляют этот SPWeb во внутреннюю коллекцию m_openedWebs.

Как говорится, мне интересно, почему вы когда-либо располагали объект SPWeb? Существуют ли какие-либо реальные сценарии, в которых вы должны располагать объектами SPWeb?

UPDATE

Я только что понял, что сэкономил небольшую деталь, которая может быть важной. Объект SPSite не вызывает Dispose () для своих дочерних SPWebs, но вызывает Close () . В текущей реализации SharePoint это то же самое, что и Dispose () , потому что SPWeb.Dispose () просто содержит:

public void Dispose()
{
    this.Close();
}

Таким образом, одной из причин удаления объектов SPWeb может быть совместимость с будущими реализациями SharePoint, где SPWeb.Dispose () не только вызывает SPWeb.Close () . Я все еще нахожу неудобным «двойное удаление» моих SPWebs только по этой причине.

Ответы [ 4 ]

2 голосов
/ 15 марта 2011

Вы правы, удаление SPSite закроет связанные SPWeb объекты.

Основной сценарий, в котором вы хотите сразу закрыть SPWeb, - это когда вы делаете что-то вроде:

foreach (SPWeb web in site.AllWebs) 
{ 
     // do something with the web object 
    web.dispose();        // <-- this is mandatory!
}

Для нормального открытия и закрытия одного SPSite / SPWeb это не имеет значения, но я бы сказал, что это все еще хорошая практика (особенно для новых разработчиков SharePoint).

Если вы еще этого не сделали, я настоятельно рекомендую прочитать сообщение Стефана Госснера: http://blogs.technet.com/b/stefan_gossner/archive/2008/12/05/disposing-spweb-and-spsite-objects.aspx

0 голосов
/ 16 марта 2011

Я бы убедился, что вы используете SPDisposeCheck .После Visual Studio это , должен иметь инструмент для разработки SharePoint.Последняя версия теперь включает правила, когда не следует удалять объекты:

Мы добавили несколько проверок, когда «НЕ» для удаления объектов, созданных SharePoint для внутреннего использования.SPDisposeCheck v1.3 не сообщал об этих недавно сообщенных правилах «НЕ БЕРИ УТИЛИЗАЦИИ» (DND). *.

0 голосов
/ 15 марта 2011

Если вы читаете / записываете данные в / из нескольких экземпляров SPWebs, созданных на SPSite, и теряете контроль над открытым, вы скоро столкнетесь с проблемами параллелизма данных, когда вам придется делать AllowUnSafeUpdates по всему место, которое обычно является плохой практикой.

У Криса О'Брайена есть хорошая запись в блоге на SPWeb и IDisposable: http://www.sharepointnutsandbolts.com/2008/06/disposing-sharepoint-objects-what-they.html

0 голосов
/ 15 марта 2011

Это интересная дилемма, Бинфорд, и я, конечно, до сих пор не знал, что объект SPSite - это простота, избавляющаяся от любых привязанных к нему SPWebs.

Если то, что вы говорите, так, то единственной причиной, по которой я мог бы подумать, что вы все еще хотите явно обрабатывать SPWeb, может быть ситуация, когда сценарий более сложный, например, использование двух или более объектов SPWebs, когда требуется время для создания уничтожить их, таким образом, становится более важным фактором.

Например, представьте, что у вас есть 7 экземпляров SPWeb внутри вашего SPSite с использованием блока, каждый из которых выполняет серию длительных и сложных операций перед утилизацией - вам нужно как можно скорее закрыть и утилизировать эти объекты, чтобы максимально эффективно использовать ресурсы памяти и собирать мусор.

Тем не менее, в самых основных случаях (1 SPSite, 1 SPWeb, как вы подробно описали выше), я начинаю задаваться вопросом, является ли вообще необходимым явное удаление SPWeb.

Мне нужно больше исследований и мнений, но спасибо, что предупредили меня об этом.

...