C# Singleton
In questi ultimi mesi ho avuto la necessità di trovare un'implementazione del pattern singleton in C# che fosse un buon compromesso tra scarnezza del codice e laziness nella creazione dell'istanza.
Dopo un pò di ricerche ed esperimenti ho scelto la soluzione di seguito:
public sealed class MyObject
{
// Dichiaro un costruttore statico per far si che il compilatore c# non
// consideri il tipo come beforefieldinit
static MyObject() { }
MyObject() { }
// Istanza privata dell'oggetto
private static readonly MyObject _instance = new MyObject();
// Proprietà pubblica che espone l'istanza all'esterno
public static MyObject Instance
{
get { return _instance; }
}
}
Il costruttore statico garantisce che l'implementazione sia thread-safe: in questo modo l'inizializzazione dell'istanza _instance viene eseguita una sola volta per esecuzione. Inoltre per la presenza dello stesso costruttore statico la classe non viene marcata con il flag beforefieldinit dal compilatore, l'oggetto _instance viene quindi istanziato solamente alla primo accesso ad una proprietà statica di MyObject.
Se avete la necessità di un'implementazione thread safe potete modificare la proprietà pubblica come segue:
public sealed class MyObject
{
static MyObject() { }
MyObject() { }
private static readonly MyObject _instance = null;
public static MyObject Instance
{
get
{
lock(_instance)
{
if (_instance == null) _instance = new MyObject();
return _instance;
}
}
}
}
Cosa ne pensate di queste soluzioni? Avete individuato dei problemi a cui non ho fatto caso? Aspetto i vostri suggerimenti a riguardo nei commenti
Design Patterns in ASP.NET
Riporto un interessante articolo sull'utilizzo dei design pattern in ASP.NET. L'autore presenta alcuni dei pattern che ritiene più utili nello sviluppo di applicazioni in ASP.NET e quindi ne presenta degli esempi di utilizzo.
I diversi pattern sono raggruppati e presentati al lettore secondo questa tassonomia:
- Presentation Logic
- Model-View-Controller (MVC)
- Model-View-Presenter (MVP)
- Use Case Controller
- Host or Behavioral
- Command
- Publish-Subscribe / Observer
- Plug-in / Module / Intercepting Filter
- Structural
- Service Agent / Proxy / Broker
- Provider / Adapter
- Creational
- Factory / Builder / Injection
- Singleton
- Persistence
- Repository
Sono certo che potrete trovare anche voi queste due pagine interessanti. Buona lettura!