J'ai réfléchi à la manière d'équilibrer la conception testable à l'aide de l'injection de dépendances avec la fourniture d'une API publique fixe simple. Mon dilemme est: les gens voudraient faire quelque chose comme ça var server = new Server(){ ... }
et ne devraient pas avoir à se soucier de créer les nombreuses dépendances et le graphique des dépendances que Server(,,,,,,)
peut avoir un. Pendant le développement, je ne m'inquiète pas trop, car j'utilise un framework IoC / DI pour gérer tout cela (je n'utilise pas les aspects de gestion du cycle de vie d'un conteneur, ce qui compliquerait les choses).
Désormais, il est peu probable que les dépendances soient réimplémentées. La composanteisation dans ce cas est presque purement pour la testabilité (et une conception décente!) Plutôt que de créer des coutures pour l'extension, etc. Les gens voudront 99,999% du temps souhaiter utiliser une configuration par défaut. Donc. Je pourrais coder en dur les dépendances. Je ne veux pas faire ça, nous perdons nos tests! Je pourrais fournir un constructeur par défaut avec des dépendances codées en dur et un qui accepte les dépendances. C'est ... désordonné et susceptible de prêter à confusion, mais viable. Je pourrais rendre le constructeur de réception de dépendance interne et faire de mes tests unitaires un assemblage ami (en supposant C #), qui nettoie l'API publique mais laisse un piège caché méchant qui se cache pour la maintenance. Avoir deux constructeurs qui sont implicitement connectés plutôt qu'explicitement serait une mauvaise conception en général dans mon livre.
En ce moment, c'est à peu près le moins de mal auquel je puisse penser. Des avis? Sagesse?