Wednesday, October 21, 2009

Gestire le risorse di SharePoint - tramite l'uso della keyword using

Una delle prime nozioni con cui abbiamo a che fare lavorando con Microsoft SharePoint 2007, è quella di fare la Dispose delle nostre SPSite e SPWeb, se non usiamo l’SPContext.
Questo per evitare che tutte le risorse del server siano usate da queste classi.

Ecco come solitamente come si agisce per esser sicuro di disporre le classi di cui sopra:
public SPList GetList(string webUri, string listName)
{
using (SPSite site = new SPSite(webUri))
{
using (SPWeb web = site.OpenWeb())
{
return web.Lists[listName];
}
}
}

Sembra perfetto; otteniamo la nostra SPSite da cui prendiamo la nostra SPWeb e ritorniamo l’SPList, dove lavorare…
Il problema è che non possiamo lavorare sull’SPList dopo che l’SPWeb sarà disposta (passatemi il termine :) ).
Cercando in rete sono venuto a conoscenza che non otteniamo un’eccezione del tipo ObjectDisposed exception perchè Microsoft se eccessivamente
preoccupata al riguardo.

Così succede che ritornando una SPList di un SPWeb non più esistenze, ne verrà creato uno nuovo e lo terremo attivo perchè SPList non implementa
IDisposable.
Aumentando la verbosità dei log verremo avvertiti così dell’uso di una SPWeb che non esiste più:


Detected use of SPRequest for previously closed SPWeb object.
Please close SPWeb objects when you are done with all objects obtained from them, but not before Stack trace:
Una delle soluzioni applicabili per evitare questo problema è l’uso di delegate nei nostri metodi.
Eccone un esempio copiato da Jonas Nilsson.


public void WithList(string webUri, string listName, Action action)
{
WithWeb(webUri, delegate(SPWeb web))
{
foreach (SPList list in web.Lists)
{
if (list.RootFolder.Name == listName)
{
action(list);
break;
}
}
});
}

public void WithWeb(string uri, Action action)
{
using (SPSite site = new SPSite(uri))
{
using (SPWeb web = site.OpenWeb())
{
action(web);
}
}
}


Come lo stesso autore avverte questa non è la panacea di tutti i mali.
Io rimango dell’idea che una buona architettura dell’intera applicazione risolve abbondantemente il problema ;D
Ciao
 
 
 
 

No comments:

Post a Comment