Ho riflettuto su come bilanciare la progettazione testabile usando l'iniezione delle dipendenze fornendo una semplice API pubblica fissa. Il mio dilemma è: la gente vorrebbe fare qualcosa di simile var server = new Server(){ ... }
e non doversi preoccupare di creare le molte dipendenze e il grafico delle dipendenze che si Server(,,,,,,)
possono avere. Durante lo sviluppo, non mi preoccupo troppo, poiché utilizzo un framework IoC / DI per gestire tutto ciò (non sto usando gli aspetti di gestione del ciclo di vita di alcun contenitore, il che complicherebbe ulteriormente le cose).
Ora è improbabile che le dipendenze vengano nuovamente implementate. La componentizzazione in questo caso è quasi puramente per testabilità (e design decente!) Piuttosto che creare cuciture per l'estensione, ecc. Le persone vorranno il 99,999% delle volte utilizzare una configurazione predefinita. Così. Potrei codificare le dipendenze. Non voglio farlo, perdiamo i nostri test! Potrei fornire a un costruttore predefinito dipendenze hardcoded e uno che accetta dipendenze. È ... disordinato e probabilmente confuso, ma praticabile. Potrei rendere la dipendenza che riceve il costruttore interno e rendere la mia unità test un assembly amico (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 progetto in generale nel mio libro.
Al momento è il minimo male che mi viene in mente. Opinioni? Saggezza?