Estive pensando em como equilibrar o design testável usando injeção de dependência com o fornecimento de API pública fixa e simples. Meu dilema é: as pessoas gostariam de fazer algo assim var server = new Server(){ ... }
e não precisavam se preocupar em criar as muitas dependências e o gráfico das dependências que Server(,,,,,,)
podem ter. Durante o desenvolvimento, não me preocupo muito, pois uso uma estrutura de IoC / DI para lidar com tudo isso (não estou usando os aspectos de gerenciamento do ciclo de vida de nenhum contêiner, o que complicaria ainda mais as coisas).
Agora, é improvável que as dependências sejam reimplementadas. Neste caso, a componente é quase puramente testável (e com um design decente!), Em vez de criar costuras para extensão, etc. As pessoas 99.999% do tempo desejam usar uma configuração padrão. Então. Eu poderia codificar as dependências. Não quero fazer isso, perdemos nossos testes! Eu poderia fornecer um construtor padrão com dependências codificadas e uma que aceita dependências. Isso é ... bagunçado, e provavelmente confuso, mas viável. Eu poderia tornar a dependência do construtor interno e tornar minha unidade testa um assembly amigo (assumindo C #), que arruma a API pública, mas deixa uma armadilha oculta desagradável à espreita para manutenção. Ter dois construtores que estão implicitamente conectados e não explicitamente seria um projeto ruim em geral no meu livro.
No momento, esse é o mínimo mal que posso pensar. Opiniões? Sabedoria?