Zaktualizowano 06/08/2009 15:52: Krótka odpowiedź NO. Oryginalne pytanie:SPWeb.Site, czy należy wywołać na nim funkcję Dispose()?
Nie mogę znaleźć żadnego odniesienia, które zawiera wskazówki dotyczące SPWeb.Site w zakresie usuwania. Poszedłem za jedne z bardziej popularnych dokumentacji najlepszych praktyk w zakresie usuwania obiektów SharePoint:
- http://www.sharepointdevwiki.com/display/public/When+to+Dispose+SharePoint+objects
- http://msdn.microsoft.com/en-us/library/aa973248.aspx
- http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx
Niestety żaden z tych wytycznych wspomnieć SPWeb.Site. Aby dać pewien kontekst, Piszę API przedłużacza publiczna, która akceptuje SPWeb jako argument do metody a mianowicie:
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
szukałem jako metodę Close() w refelector dla SPWeb, który jest nazywany przez SPWeb.Dispose() i nie ma w nim nic, co wskazywałoby na faktyczne usunięcie pola członka SPSite.
Aktualizacja: 06/08/2009 13:47
Na Alex's sugestia
„Umieścić go w pętli, czyli 100 razy i użyj klucza rejestru SPRequestStackTrace opisaną w rozwiązywaniu SPSite/SPWeb przecieki w WSS v3 i MOSS 2007, aby sprawdzić, czy Twój kod testowy jest źródłem problemu. "
Pobiegłem następujący kawałek kodu dołączonego wewnątrz webpart:
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
Nic w logach SharePoint pojawił.
Chociaż zawaham się wyciągnąć jakiekolwiek prawdziwe wnioski z tego naiwnego eksperymentu, sugerowałoby to, że jest to , a nie niezbędne do pozbycia się SPWeb.Site. Byłoby naprawdę miło uzyskać konkretną odpowiedź od kogoś bardziej poinformowanego na ten temat.
Aktualizacja: 08.06.2009 14:52 Wspomagana przez Grega komentarz wypracowałem cesji m_Site i wydaje się to ostatecznie zawsze przeszły do SPWeb poprzez wewnętrzne konstruktorów. Na przykład. SPWeb.OpenWeb przechodzi w ten do nowego SPWeb(). Tak więc jestem bardziej pewny, że SPWeb.Site powinien być usunięty, a może być przyczyną problemów, gdyby tak było.
Patrząc na to, nie jest jasne. Zadałem to samo pytanie, co komentarz do postu Rogera Lamb, ale nie otrzymałem odpowiedzi. –
Moim zdaniem, i to jest po prostu opinia, nie, nigdy nie powinieneś mieć do czynienia z tym obiektem. Czemu? Cóż, jest zwracana przez właściwość z innego obiektu. Jeśli ten inny obiekt jest do dyspozycji, powinieneś wyrzucić * to * i pozwolić mu zadbać o własne zasoby. Nic, co czytasz z własności, nie powinno być usuwane przez twój własny kod, który byłby dla mnie błędem w tym systemie. –
@ lasse-v-karlsen Zgadzam się z Tobą w 100%, jednak w interfejsie SharePoint API jest wiele dziwnych rzeczy i naprawdę musisz zrozumieć te lub ryzykować wyciek pamięci. Więc chociaż może to być błąd w API, chciałabym go zrozumieć, czy jest tam, czy nie :) –