Stavo pensando a come bilanciare la progettazione testabile usando l'iniezione di dipendenza con l'offerta di API pubbliche fisse semplici. Il mio dilemma è: le persone vorrebbero fare qualcosa come var server = new Server(){ ... }
e non devono preoccuparsi di creare le molte dipendenze e il grafico delle dipendenze che potrebbe avere un Server(,,,,,,)
. Durante lo sviluppo, non mi preoccupo troppo, perché utilizzo un framework IoC / DI per gestire tutto ciò (non sto utilizzando gli aspetti di gestione del ciclo di vita di qualsiasi contenitore, il che complicherebbe ulteriormente le cose).
Ora è improbabile che le dipendenze vengano nuovamente implementate. La componentistica in questo caso è quasi puramente per testabilità (e design decente!) Piuttosto che creare cuciture per l'estensione, ecc. Il 99,999% delle persone desidera utilizzare una configurazione predefinita. Così. Potrei hardcode le dipendenze. Non voglio farlo, perdiamo i nostri test! Potrei fornire un costruttore predefinito con dipendenze hard-coded e uno che prende le dipendenze. Questo è ... disordinato e probabilmente confuso, ma fattibile. Potrei fare in modo che la dipendenza riceva il costruttore interno e fare in modo che la mia unità collauda un'assemblea di amici (supponendo C #), che riordina l'API pubblica ma lascia una cattiva trappola nascosta in agguato per la manutenzione. Avere due costruttori che sono implicitamente connessi piuttosto che esplicitamente sarebbe un cattivo design in generale nel mio libro.
Al momento è il meno male che riesco a pensare. Opinioni? Saggezza?