Design Patterns – Abstract Factory

Tipologia: Creazionale

Obiettivo: Fornire un’interfaccia per creare famiglie di oggetti correlati o dipendenti senza specificare le loro classi concrete

Frequenza di utilizzo: Alta

Componenti:

Abstract Factory - UML
Diagramma UML
  • Abstract Factory: dichiara un’interfaccia per operazioni che creano prodotti astratti
  • ConcreteFactory: implementa le operazioni per creare gli oggetti “prodotto” concreti
  • AbstractProduct: dichiara un’interfaccia per il tipo di dato “prodotto”
  • Product: è l’oggetto “prodotto” creato con la corrispondente classe factory astratta. Implementa l’interfaccia AbstractProduct
  • Client: utilizza le interfacce dichiarate dalle classi AbstractFactory e AbstractProduct

Continua a leggere Design Patterns – Abstract Factory

Introduzione alla dependency injection

Dependency Injection (DI) e Inversion Of Control (IoC) sono due elementi fondamentali per lo sviluppo di applicazioni “moderne”. A prima vista possono sembrare due concetti complessi ma, una volta appresi i principi, difficilmente si potrà farne a meno.

Il problema da risolvere è la dipendenza tra oggetti

Continua a leggere Introduzione alla dependency injection

Programmazione Asincrona e deadlock

Nel refactoring di applicazioni windows form (ebbene si, esistono ancora!) o comunque in quelle applicazioni con lunghi task di elaborazione, uno dei problemi di maggiore impatto per gli utenti è il freeze dell’interfaccia utente.

A partire dal framework 4.5 (C# 5) sono disponibili  le keyword async e await per la scrittura di codice asincrono.  Una delle funzionalità che può essere sfruttata a partire da questa versione (al momento della scrittura di questo articolo è disponibile la release 7.2, ma per questioni legacy non posso upgradare l’applicazione oltre la versione 5.0) è il TAP (Task Async Pattern) .

Task Async Pattern

Utilizzando TAP con async/await è possibile scrivere codice asincrono in maniera semplice senza perdere in potenza. Il seguente metodo consente di eseguire in forma asincrona un metodo (MyMethod) che non lo è.

Per poter ottenere il risultato dell’elaborazione del metodo MyMethodAsync possiamo utilizzare il seguente codice:

L’utilizzo di questo codice all’interno di una console application funziona correttamente. Nel caso in cui la nostra applicazione sia GUI/ASP il risultato è un deadlock. L’esecuzione dovrà essere terminata utilizzando il task manager. 

I metodi asincroni dovrebbe prevenire il blocco delle applicazioni, ma non è sempre così.

Leggendo un pò di documentazione online, ho risolto il problema utilizzando il metodo ConfigureAwait. Questo metodo consente di effettuare l’await del Task su cui stiamo effettuando la configurazione. L’utilizzo del parametro booleano continueOnCapturedContext e dovrà essere impostato a true nel caso in cui sia necessario attendere il ritorno dal context catturato, oppure false nel caso non sia necessario. L’esempio che generava il deadlock può essere rescritto nel seguente modo:

L’utilizzo del metodo ConfigureAwait con continueOnCapturedContext impostato a false consente di risolvere il problema di deadlock.