Avete un sistema “chiuso” che funziona, ma che è chiuso, quindi non consente in nessun modo di “infilare” logica nella sua pipeline e questo è ovviamente un problema perché il sistema non rispetta l’Open/Close Principle ma ci potete fare poco perché l’architettura del sistema non vi consente comunque di introdurre degli “extension point”…
Immaginiamoci un componente, un qualsiasi XyzProvider, che viene usato un po’ ovunque istanziandolo direttamente con una malsanissima “new”, componente che avrebbe molto senso essere trattato come singleton ma che in realtà viene usato come transiente…
Adesso avete la necessità di consentire ad una “terza parte” di iniettare logica all’interno della pipeline delle azioni di quel componente, l’inghippo è che il componente non espone nessun extension point, il componente non è gestito da un “container” per “Inversion of Control” e di conseguenza vi scordate immediatamente qualsivoglia velleità di estensione…
Naturalmente non avete nessuna possibilità di modificare l’interfaccia pubblica…insomma una simpatica situazione del piffero Smile
che fare?
Messaging to the rescue
Siete ovviamente, e fortunatamente, obbligati a disaccoppiare non avete scelta, ma come?
La soluzione più semplice è usare un broker, sfruttando il concetto di “domain events”:
  • Non modificate l’interfaccia pubblica delle classi legacy;
  • Potete fare broadcast/dispatch di messaggi in tutto il sistema e reagire a questi messaggi ovunque senza nessun bisogno di conoscere il mittente;
Insomma massimo ritorno con il minimo sforzo Smile with tongue out
.m