2011-11-08 9 views
14

¿Por qué utilizar algunos ejemplos SharePointsitio de SPSite = new SPSite (SPContext.Current.Web.Url) vs SPContext.Current.Web.Site

using (SPSite site = new SPSite(SPContext.Current.Web.Url)) 
{ 
    ... 
} 

y no sólo simplemente?

SPSite site = SPContext.Current.Web.Site; 
... 

actualización

Creo que he estrechado la cuestión hasta el siguiente:

Parece que yo no utilizo SPContent.Current directamente, a menos que esté seguro de que mi código se ejecuta en el interior SharePoint. ¿Pero cuándo eso no sería cierto?

+1

Tome un vistazo a una pregunta similar de mí: http://sharepoint.stackexchange.com/questions/20192/SPContext usando-corriente-o-usando-estático-url –

+0

Gracias por el enlace. He actualizado mi pregunta. –

+1

En proyectos más grandes a veces tiene utilidades externas que no se ejecutan en SharePoint. Otro ejemplo son las pruebas unitarias que tampoco se ejecutan en SharePoint. Si simplemente está desarrollando partes web visuales y no prueba la unidad, su código se ejecuta en SP. –

Respuesta

10

Consulte la documentación de mejores prácticas en disposing objects in SharePoint 2010 de Microsoft, sin embargo, hay opposing views.

Hay algunos puntos clave para proyectos de SharePoint:

  • Siempre deseche sus SPWeb/SPSite objetos -> pérdidas de memoria
  • Hacer uso de SPContext.Current ... cuando esté seguro el código se ejecuta en un contexto de SharePoint
    • pruebas unitarias significan ningún contexto Sharepoint
    • utilidades externas significan ningún contexto Sharepoint
    • Powershell significa que no hay contexto de SharePoint (p. Ej. la activación de una función de receptor con función puede fallar)
  • No tire SPContext.Current ... pero crear su propio objeto (de nuevo using)

Es posible que tenga problems with consistency con su SP múltiples objetos .. .

Al final SPSite site = SPContext.Current.Web.Site; está bien en algunos casos, pero no tiene control sobre este objeto site - ese podría ser el problema. Si opta por new SPSite(...), siempre tendrá suSPSite y no algo que SharePoint haya creado y administrado para usted.

Personalmente, casi siempre uso la estructura using para que todos los objetos se desechen correctamente después. Alternativamente, uso SPContext.Current.Web sin desechar.

4

Depende del contexto en el que se ejecuta el código. Por ejemplo, necesita crear una nueva instancia de SPSite si se está ejecutando dentro de un bloque RunWithElevatedPrivileges.

0

Dennis G es el correcto. Desechar el SPSite/SPWeb/etc es importante, pero asegúrese de no eliminar directamente los objetos que le proporciona la API. Es sutil pero crítico; de lo contrario, tu respuesta nunca se generará o incluso provocará abortos. En mi experiencia, si necesito información rápida sobre la propiedad SPSite o SPWeb que estoy seguro está disponible para el contexto del usuario (ya sea un usuario autorizado del administrador de contenido o anónimo), el uso del objeto SPContext.Current. * Es excelente.De lo contrario, utilice los RunWithElevatedPriveleges método para envolver su código y dentro de esa lambda tiene el siguiente patrón:

SPSecurity.RunWithElevatedPrivileges(() => 
{ 
    using (SPSite site = new SPSite(SPContext.Current.Site.ID)) 
    { 
    using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ID)) 
    { 
    // stuff goes here elevated 
    } 
    } 
}); 
Cuestiones relacionadas