Presumo che quando si dice un "wrapper DateTime" ciò che si intende veramente è un'interfaccia "Orologio" che può essere interrogata per il valore DateTime che gli umani occasionalmente percepiscono come "ora".
Anch'io ho riscontrato il problema di dover passare molto le mie dipendenze, e l'ho risolto con un adattamento universale leggero di Domain Driven Design invece di un Localizzatore di servizi. (Non mi piacciono i localizzatori di servizio proprio perché, come ha sottolineato JDT, possono rimandare un errore in fase di compilazione a un errore di runtime.)
L'idea è questa:
Ogni oggetto appartiene idealmente a un dominio . In questo caso, è chiamato oggetto di quel dominio.
Un dominio è la fabbrica esclusiva dei suoi soggetti. Nessun altro può creare un'istanza di un soggetto. Ciò a sua volta significa che tutti i soggetti costruttori sono nascosti al mondo esterno. (Pacchetto privato in java.)
Ogni soggetto riceve un riferimento al dominio a cui appartiene come primo parametro del costruttore. (Questo è analogo al modo in cui ogni metodo di un oggetto riceve il puntatore this
come il suo primo parametro (nascosto).)
Ogni soggetto che ha bisogno di un qualche tipo di servizio lo ottiene dal proprio dominio tramite una proprietà. (GetXYZ regolare (), nessuna ricerca della mappa.)
Il dominio può offrire direttamente un servizio (come in myDomain.getGradientSaturator()
) o indirettamente (come in myDomain.getSplineDomain().getReticulator()
.)
Idealmente, i soggetti sono visibili al codice esterno (codice al di fuori del namespace o del pacchetto del loro dominio) tramite interfacce, non come classi concrete. (Ma questo è irrilevante per questa discussione.)
I domini ricevono le loro dipendenze come parametri del costruttore.
Nessuno ha bisogno di interrogare alcun repository per i servizi, nessun enorme elenco di dipendenze viene passato né ai costruttori né ai metodi factory, (eccetto forse ai costruttori di domini, che sono rari) e la disponibilità di tutti i servizi è garantita (quindi per parlare *) dal compilatore.
Tuttavia, in vari luoghi in cui vengono costruite gerarchie di domini, vengono forniti tutti i servizi necessari, quindi ognuno di essi può essere sostituito con una simulazione.
In mancanza di un termine migliore, sto chiamando questa Programmazione orientata al soggetto per il momento.
(*) per così dire, a meno che tu non faccia qualcosa di sciocco, come passare null
a un costruttore che si aspettava un GradientSaturator
.