Data un'architettura a livelli, in cui la logica aziendale è isolata in un pacchetto da tutti gli altri livelli, come memoria persistente, interfaccia utente, interfacce per vari servizi remoti (fornitore), ecc., sto pensando di gestire le dipendenze nel modo seguente :
All'interno della biblioteca, tutte le dipendenze vengono iniettate manualmente tramite il costruttore. Questo ha il vantaggio (che a mio parere è grande) che rende i test più espliciti, aumentandone il valore come fonte di documentazione.
Per gli altri livelli e plugin, sto pensando di iniettare manualmente solo un oggetto usato per la ricerca delle dipendenze, il che renderebbe più semplice il mocking. Dubito che ci sarebbe un solo oggetto per tutti i sottosistemi, sto semplicemente pensando a interfacce realmente specifiche, piccole e factory che implementano una o più di queste interfacce. Quante interfacce implementano una fabbrica è un dettaglio di implementazione, immagino che inizierei con una sola fabbrica che implementa tutte le interfacce e man mano che il sistema si evolve, estraggerei di conseguenza altre fabbriche e refactoring (YAGNI). Le interfacce (vale a dire la firma dei costruttori) rimarrebbero com'erano prima del refactoring, grazie a interface segregation .
La biblioteca aziendale riceve i suoi comandi dall'esterno tramite i comandi (pensa DDD).
- Cosa ne pensi di questo? Altri vantaggi e svantaggi sono ben accetti!
- Quali altre strategie per la gestione delle dipendenze preferisci in quali situazioni e perché?