Forse alcuni di voi si saranno imbattuti nei problemi di memory leak legati al rilascio non deterministico delle risorse unmanaged in .NET e all’uso di oggetti SP* in SharePoint (soprattutto SPWeb, SPSite).
Vi sono però anche altri oggetti che internamente usano SPWeb e SPSite che dovrebbero rilasciare le risorse correttamente. Ad esempio abbiamo SPWebPartManager e SPLimitedWebPartManager che internamente usano un oggetto SPWeb e che implementano IDisposable. Come già evidenziato sulla rete in diversi post (qui e qui ad esempio) purtroppo in MOSS2007 l’implementazione di IDisposable non rilascia SPWeb in queste classi, introducendo dei “simpatici” bug subdoli.
Per fortuna in SP2010 hanno sistemato la cosa e il metodo di dispose di SPWebPartManager è il seguente:
public override void Dispose()
{
base.Dispose();
if (((this.m_web != null) && !this.m_web.IsClosed) && this.m_web.IsOwnedByWebPartManager)
{
this.m_web.Dispose();
}
if (this.m_rawWebPartManager != null)
{
this.m_rawWebPartManager.Dispose();
}
this.m_isValid = false;
}
Quindi le linee guida fornite nel famoso documento di “Best Practices: Using Disposable Windows SharePoint Services Objects” vanno un minimo adattate a SP2010.