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 DefaultThingSourcBoy, # 3 com certeza parece atraente. Existe outra opção melhor? # 1 ou # 2 simplesmente não parecem valer a pena.