Existe uma alternativa à injeção bastarda? (AKA injeção de homem pobre via construtor padrão)

Geralmente, sou tentado a usar "injeção bastarda" em alguns casos. Quando eu tenho um construtor de injeção de dependência "adequado":

public class ThingMaker {
    ...
    public ThingMaker(IThingSource source){
        _source = source;
    }

Mas, então, para as aulas que pretendo comoPIs públicas (classes que outras equipes de desenvolvimento consumirão), nunca consigo encontrar uma opção melhor do que escrever um construtor "bastardo" padrão com a dependência necessária mais provável:

    public ThingMaker() : this(new DefaultThingSource()) {} 
    ...
}

A desvantagem óbvia aqui é que isso cria uma dependência estática no DefaultThingSource; idealmente, não haveria essa dependência e o consumidor sempre injetaria o IThingSource que quisesse. No entanto, isso é muito difícil de usar; os consumidores desejam criar um ThingMaker e começar a trabalhar na fabricação de coisas, meses depois, injetam outra coisa quando necessário. Isso deixa apenas algumas opções na minha opinião:

Omita o bastardo construtor; forçar o consumidor do ThingMaker a entender o IThingSource, entender como o ThingMaker interage com o IThingSource, encontrar ou escrever uma classe concreta e, em seguida, injetar uma instância em sua chamada de construto Omita o construtor bastardo e forneça uma fábrica, contêiner ou outra classe / método de bootstrapping separados; de alguma forma, faz com que o consumidor entenda que não precisa escrever seu próprio IThingSource; forçar o consumidor do ThingMaker a encontrar e entender a fábrica ou o bootstrapper e usá-l Mantenha o construtor bastardo, permitindo ao consumidor "atualizar" um objeto e executá-lo, além de lidar com a dependência estática opcional no DefaultThingSourc

Boy, # 3 com certeza parece atraente. Existe outra opção melhor? # 1 ou # 2 simplesmente não parecem valer a pena.

questionAnswers(12)

yourAnswerToTheQuestion