Actualizado el 06/08/2009 15:52: Respuesta corta NO. Pregunta original:SPWeb.Site, ¿debería llamar a Dispose() en él?
No puedo encontrar ninguna referencia que proporcione orientación sobre SPWeb.Site con respecto a la eliminación. He pasado por algunos de los más populares documentación de las mejores prácticas sobre la disposición de objetos de 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
Desafortunadamente ninguna de estas directrices mencionar SPWeb.Site. Para dar un poco de contexto, estoy escribiendo una API de extensión público que acepta un SPWeb como un argumento a un método, es decir:
public static void GetWebPartFromCatalog(this SPWeb web, string webPartName)
{
......
SPSite site = web.Site;
......
**OR** ??
using (SPSite site = web.Site)
{
....
}
}
He mirado como el método Close() en refelector para SPWeb, que se llama por SPWeb.Dispose() y no hay nada en él que indique que el campo real del miembro de SPSite está dispuesto.
Actualización: 06/08/2009 13:47
En Alex's sugerencia
"Póngalo en un bucle que se ejecuta 100 veces y usar la clave de registro SPRequestStackTrace se describe en Solución de problemas SPSite/SPWeb gotea en WSS v3 y MOSS 2007 para verificar que el código de prueba sea la fuente del problema ".
Me corrió el siguiente fragmento de código incluido dentro de un elemento Web:
for (int i = 0; i < 100; i++)
{
using (SPWeb web = SPContext.Current.Site.OpenWeb(""))
{
SPSite site = web.Site;
Debug.WriteLine(site.Url);
}
}
Nada apareció en los registros de SharePoint.
Si bien dudaría en sacar conclusiones reales de este ingenuo experimento, sugeriría que es no necesario para deshacerse de SPWeb.Site. Sería realmente agradable obtener una respuesta concreta de alguien más informado sobre este tema.
Actualización: 06/08/2009 14:52 Impulsado por el comentario de Greg trabajé a cabo las tareas de m_Site y parece que es en última instancia, siempre se pasa a través de los constructores SPWeb internos. P.ej. SPWeb.OpenWeb pasa en este a SPWeb nuevo(). Así que estoy más seguro de que SPWeb.Site debería no eliminarse, de hecho podría causar problemas si fuera así.
Al considerar esto, no está claro. Hice la misma pregunta que un comentario a la publicación de Roger Lamb, pero no tuve respuesta. –
En mi opinión, y es solo eso, una opinión, no, nunca debería tener que deshacerse de ese objeto. ¿Por qué? Bueno, se devuelve a través de una propiedad de otro objeto. Si ese otro objeto es desechable, debe eliminar * ese * y dejar que se encargue de sus propios recursos. Nada de lo que lees de una propiedad debe ser eliminado por tu propio código, que, para mí, constituiría un error en ese marco. –
@ lasse-v-karlsen Estoy de acuerdo con usted al 100%, sin embargo, hay muchas peculiaridades en la API de SharePoint y realmente necesita comprenderlas o arriesgarse a perder memoria. Así que, si bien puede ser un error en la API, me gustaría saber si está allí o no :) –