He estado contemplando cómo equilibrar el diseño comprobable utilizando la inyección de dependencia con el suministro de API pública fija simple. Mi dilema es: la gente querría hacer algo así var server = new Server(){ ... }y no tener que preocuparse por crear las muchas dependencias y gráficos de dependencias que Server(,,,,,,)pueda tener. Durante el desarrollo, no me preocupo demasiado, ya que uso un marco IoC / DI para manejar todo eso (no estoy usando los aspectos de gestión del ciclo de vida de ningún contenedor, lo que complicaría aún más las cosas).
Ahora, es poco probable que las dependencias se vuelvan a implementar. La realización de componentes en este caso es casi exclusivamente para la capacidad de prueba (¡y un diseño decente!) En lugar de crear costuras para la extensión, etc. Las personas 99.999% de las veces desearán usar una configuración predeterminada. Entonces. Podría codificar las dependencias. ¡No quiero hacer eso, perdemos nuestras pruebas! Podría proporcionar un constructor predeterminado con dependencias codificadas y uno que tenga dependencias. Eso es ... desordenado, y probablemente sea confuso, pero viable. Podría hacer que la dependencia que recibe el constructor sea interna y hacer que mi unidad pruebe un ensamblaje amigo (suponiendo C #), que ordena la API pública pero deja una desagradable trampa oculta al acecho por mantenimiento. Tener dos constructores que están implícitamente conectados en lugar de explícitamente sería un mal diseño en general en mi libro.
Por el momento eso es lo menos malvado que se me ocurre. Opiniones? ¿Sabiduría?