Thursday, October 22, 2009

Gestire le risorse di SharePoint - tramite l’uso di blocchi try/finally

Continuando le mie ricerche sull’argomento come gestire le risorse di SharePoint (vedi post precedente), mi sono imbattuto in un’altro
articolo, questa volta tra i blog di msdn.

L’autore è Roger Lamb e l’articolo risale al 14 Gennaio 2009 e spiega l’utilizzo dei blocchi using e try/finally; eccovene un sunto.
L’attenzione è sempre posta sulla creazione e cancellazione degli oggetti SPSite e SPWeb.
Lo sviluppatore SharePoint (come scritto anche nel post di Roger Lamb) deve stare molto attento alle risorse che utilizza e, ancor di più, alla creazione di oggetti SPSite e SPWeb.
Spesso come consulente ho visto applicazioni dove gli sviluppatori si erano esposti a performance acrobatiche, sull’utilizzo dei due oggetti di cui sopra,
al limite del possibile; ottenendo così un uso massivo delle risorse del server.

Bisogna ricordare che, tutte le applicazioni .NET si basano sul .NET Common Language Runtime (CLR) (ricordatevi del Garbage Collector).
Di seguito alcune regole sull’utilizzo dei blocchi using e try/finally.

Using

L’uso dello using aumenta la pulizia del codice e diminuisce i controlli delle risorse utilizzate.
In realtà il CLR inserisce in automatico nel codice MSIL un blocco try/finally per disporre le risorse utilizzate.

public void UsingBestPractice()
{
using (SPSite siteCollection = new SPSite("http://moss"))
{
using (SPWeb web = siteCollection.OpenWeb())
{
//...
} // SPWeb object web.Dispose() automatically called
} // SPSite object siteCollection.Dispose() automatically called
}


try/finally

Ci sono dei casi in cui non possiamo usare la using nel nostro codice.
In questi casi allora possiamo utilizzare un blocco try/finally.

Gentilmente evitate di inserire un blocco catch che poi non viene usato o viene usato solamente per scrivere dei log.
Ne ho già visti a bizzeffe.


void TryFinallyBestPractice()
{
SPSite siteCollection = null;
SPWeb web = null;

try
{
siteCollection = new SPSite("http://moss");
web = siteCollection.OpenWeb();
Console.WriteLine(web.Title);
}
// optionally catch { ... make sure you handle if you use catch }
finally
{
if (web != null)
web.Dispose();

if (siteCollection != null)
siteCollection.Dispose();
}
}


L’uso di SPContext all’interno dell’using

Mai, mai usare l’SPContext all’interno del blocco using.

L’oggetto SPContext è un oggetto che gestisce SharePoint e non deve mai esser rilasciato dallo sviluppatore.

Quindi E’ SERVERAMENTE VIETATO QUANTO SEGUE:

using( SPWeb web = SPControl.GetContextWeb(HttpContext.Current)) { ... }


Combinazioni

Bisogna far attenzione quando si inizia ad usare in maniera combinata il blocco using e il SPContext:

void CombiningCallsLeak()
{
using (SPWeb web = new SPSite(SPContext.Current.Web.Url).OpenWeb())
{
// ... new SPSite will be leaked
} // SPWeb object web.Dispose() automatically called
}

sarebbe più corretto scrivere le righe di codice di sopra, nella seguente maniera

void CombiningCallsBestPractice()
{
using (SPSite siteCollection = new SPSite(SPContext.Current.Web.Url))
{
using (SPWeb web = siteCollection.OpenWeb())
{
} // SPWeb object web.Dispose() automatically called
} // SPSite object siteCollection.Dispose() automatically called
}

I casi di cui sopra sono degli esempi di Best Practices a cui far riferimento durante lo sviluppo di un’applicazione Microsoft Office SharePoint.

No comments:

Post a Comment