Como trabajar con los objetos SPWeb y SPSite


Buenas a todos,

Hoy quiero hacer un resumen de un artículo de la MSDN, en donde se explica cómo trabajar adecuadamente con estos dos objetos de SharePoint. Últimamente, como a otros artículos de buenas prácticas, acudo muy a menudo a éste, con el objetivo de mejorar el desempeño del código y seguir las recomendaciones a la hora de desarrollar para SharePoint.

Desde que he retomado mi blog ya he escrito algunas entradas comentando acerca de algunas de las buenas prácticas que se deberían de seguir. Hoy resumo en una tabla todas las buenas prácticas del artículo para tener una guía de acceso rápido y poder fácilmente recordar como se deben usar estos dos objetos, sobre todo al principio algunos de los casos me sorprendieron. Como siempre, para recordarlo me resulta más sencillo escribirlo y compartirlo ;).

Accediendo a SPWeb y SPSite
Mal uso:

using(SPWeb web = (new SPSite(url)).OpenWeb){}
Buen uso:

using(SPSite site = new SPSite(url))
{
    using(SPWeb web = site.OpenWeb())
    {

    }
}
Uso del contexto
Mal uso:

using(SPWeb web = SPContext.Current.Web){}

using(SPSite site = SPContext.Current.Site){}
Buen uso:
Cuando se usa el contexto los objetos no tienen que ser liberados, ya que estos son manejados por el Framework de SharePoint que se encarga de gestionarlos.
Añadir una nueva colección de sitios
Mal uso:

SPSiteCollection siteCollections = webApp.Sites;
SPSite siteCollection = siteCollections.Add
("sites/example","DOMAIN\\exampleUser","example@example.com");
Buen uso:

SPSiteCollection siteCollections = webApp.Sites;
    using (SPSite siteCollection = siteCollections.Add
("sites/example","DOMAIN\\exampleUser","example@example.com"))
    {
    }
Accediendo a la colección de sitios usando el índice []
Mal uso:

SPSiteCollection siteCollections = webApp.Sites;
SPSite siteCollectionInner = siteCollections[0];
Buen uso:

SPSite siteCollectionInner = null;
        try
        {
            SPSiteCollection siteCollections = webApp.Sites;

            siteCollectionInner = siteCollections[0];
        }
        finally
        {
            if (siteCollectionInner != null)
                siteCollectionInner.Dispose();
        }
Recorriendo todas las colecciones de sitios
Mal uso:

SPSiteCollection siteCollections = webApp.Sites;

foreach (SPSite siteCollectionInner in siteCollections){}
Buen uso:

SPSiteCollection siteCollections = webApp.Sites;

foreach (SPSite siteCollectionInner in siteCollections)
{
    try{
                // ...
    }
    finally
    {
        if(siteCollectionInner != null)
            siteCollectionInner.Dispose();
    }
}
Añadiendo nuevos sitios
Mal uso:

SPWeb web = siteCollection.AllWebs.Add("example");

SPWebCollection webCollection = siteCollection.AllWebs;
SPWeb innerWeb = webCollection.Add(strWebUrl);
Buen uso:

using (SPWeb web = siteCollection.AllWebs.Add
("site-relative URL"))
{}

SPWebCollection webCollection = siteCollection.AllWebs;
using (SPWeb innerWeb = webCollection.Add(strWebUrl))
{
     //...
}
Accediendo sitios usando el índice []
Mal uso:

SPWeb web = siteCollection.AllWebs[0]
Buen uso:

using (SPWeb web = siteCollection.AllWebs[0])
{
}
Recorriendo todos los sitios de una colección
Mal uso:

foreach (SPWeb innerWeb in siteCollection.AllWebs)
{
      //To do something
}
Buen uso:

foreach (SPWeb innerWeb in siteCollection.AllWebs)
{
     try
     {
         //To do something
     }
     finally
     {
         if(innerWeb != null)
              innerWeb.Dispose();
     }
}
Usando RootWeb
Mal uso:

Buen uso:
Al igual que cuando usamos el contexto, ese objeto no debe ser liberado

SPWeb rootWeb = siteCollection.RootWeb;

Dejo para el final la explicación del por qué de los “buen uso” de cada caso, ya que prácticamente en todos se trata del mismo motivo.

Los objetos SPSite y SPWeb usan código y memoria no manejada. Esto provoca principalmente que el “garbage collector” no libere automáticamente y de forma correcta los objetos de este tipo. Si no se resuelve adecuadamente haciendo uso de dispose o en su defecto, por medio de using, quedarán residuos de memoria que no son correctamente desalojados. Esto puede provocar problemas de rendimiento o problemas de memoria de la aplicación, entre otros.

Como siempre, os dejo el enlace de referencia (este ya enlazado alguna que otra vez):

http://msdn.microsoft.com/en-us/library/aa973248.aspx

Para comprobar que estamos usando correctamente los objetos SPSite y SPWeb, existe la herramienta SPDisposeCheck, que se puede usar tanto integrada con Visual Studio, como ejecutada desde línea de comandos para evaluar una dll completa. Con esta herramienta podemos comprobar de forma sencilla si se están siguiendo estas buenas prácticas.

Espero que os sirva esta entrada de referencia para recordar el uso adecuado de estos objetos.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s