¿Cuándo llamar a Dispose si se pasa SPContext.Site a una biblioteca de clases?
Pregunta
¡Solo estoy buscando un poco de control de cordura en este!
Estoy viendo muchas clases que tienen SPSite
o SPWeb
como constructor de la clase.
La clase se crea una instancia usando SPContext.Site
como parámetro SPSite
p.ej.
public MyClass {
SPWeb _web;
public MyClass(SPSite site) {
_web = site.RootWeb;
}
// Other methods that make use of _web
}
Debería _web
ser eliminado?¿_web es solo un puntero a SPContext.Site.RootWeb o hay otra copia de SPWeb
que hay que eliminar?
lo sé con SPContext.Site.OpenWeb()
deberías llamar Dispose()
.
Entonces, ¿qué pasa con el uso anterior?
pasará SPSite
/ SPWeb
como asignarlo a una variable local siempre solo tiene la referencia a la misma SPContext
?
Solución
En tu caso _web
No es necesario desecharlo, ya que lo obtendrá del RootWeb
y objetos web recuperados de RootWeb
no es necesario eliminarlo.
EIDT
Además, si el SPSite
El objeto pasado como parámetro al constructor se deriva del SPContext
, no es necesario desecharlo.De lo contrario, debe eliminarse en la clase llamada o desde la clase que llama, según el requisito.
Otros consejos
No llame explícitamente a Dispose() en la propiedad SPSite.RootWeb.La limpieza de eliminación será manejada automáticamente por SharePoint y .NET framework.Para las personalizaciones existentes de SharePoint, se recomienda la eliminación de RootWeb Dispose explícito para evitar una condición de caso límite en la que SPContext.Current.Web tiene igualdad con SPSite.RootWeb.Pueden ocurrir problemas al desechar RootWeb cuando se obtiene de cualquier variación de SPContext (por ejemplo:SPContext.Site.RootWeb, SPContext.Current.Site.RootWeb y GetContextSite(Context).RootWeb).
Para más visita...MSDN