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!
Rispondere con 404 in ASP.NET
In Tizio&Caio ci sono diversi tipi di risorse che vengono realizzate e pubblicate per gli utenti sul sito: molte di queste, per assicurarne la qualità, richiedono di essere validate da un altro membro dello staff diverso dal creatore.
Durante questa fase la risorsa è realmente esistente all'URL in cui si troverà, ma la sua visualizzazione è limitata al solo staff, per le ragioni che ho spiegato prima. Per evitare che qualche utente malizioso possa andare alla ricerca di queste risorse facciamo in modo che, se il visitatore manca delle necessarie autorizzazioni non visualizzi un generico errore di accesso, ma un bel 404.
Fortunatamente non c'è alcun bisogno di andare a smanettare con la sezione customErrors del web.config, è sufficiente generare una HttpException:
throw new HttpException(404, "Page not found");
Il runtime di ASP.NET rileverà l'eccezione e si occuperà del redirect alla opportuna pagina per l'errore 404.
Perchè sto iniziando ad apprezzare VB.NET
Quando ho deciso che era arrivato il momento di trasformare T&C da un rudimentale accrocchio di file interpretati in qualcosa di più sensato (almeno dal punto di vista della software engineering) passando ad Asp.NET, la prima decisione importante che mi spettava prendere è stata quella del linguaggio da utilizzare.
Vista la facilità di portare codice dal VbScript di ASP in VB.NET ho scelto questo linguaggio, nonostante il C# sia evidentemente più elegante e meno prolisso nei costrutti.
C'è poi da dire che il Framework.Net permette la commistione di linguaggi (sebbene sia necessario separare i diversi "dialetti" in assembly diversi), quindi in futuro potrei realizzare migrazioni parziali e/o pezzi di sito o librerie interne senza difficoltà in C# con poco lavoro aggiuntivo.
Però ora devo ammettere che le idee non sono più così nitide e definite...
Mela
Sto per consegnare un simpatico progetto di gruppo per un simpatico esame per l'universitià, il progetto si chiama Mela (codename "Gmailperòmeglio"), per una straordinaria coincidenza con le iniziali dei nomi di battesimo dei quattro componenti del gruppo.
Il sottoscritto ed altre tre persone hanno realizzato un webclient email con tecnologia ajax: il nome in codice del progetto oltretutto parla da se: GMail, però meglio!!!
Ora come ora son molto preso dallo scrivere l'ultima parte della documentazione, magari in un prossimo post spiego meglio di cosa si è trattato.