Je suis le plus souvent tenté d'utiliser l'"injection bâtarde" dans quelques cas. Quand j'ai un constructeur d'injection de dépendances "correct" :
public class ThingMaker {
...
public ThingMaker(IThingSource source){
_source = source;
}
Mais alors, pour les cours que j'ai l'intention de faire en tant que APIs publiques (classes qui seront utilisées par d'autres équipes de développement), je ne trouve jamais de meilleure option que d'écrire un constructeur "bâtard" par défaut avec la dépendance la plus probable :
public ThingMaker() : this(new DefaultThingSource()) {}
...
}
L'inconvénient évident ici est que cela crée une dépendance statique sur DefaultThingSource ; idéalement, il n'y aurait pas une telle dépendance, et le consommateur injecterait toujours l'IThingSource qu'il veut. Cependant, c'est trop difficile à utiliser ; les consommateurs veulent ouvrir un ThingMaker et se mettre au travail pour créer des choses, puis quelques mois plus tard injecter quelque chose d'autre quand le besoin s'en fait sentir. À mon avis, il ne reste que quelques options :
- Omettre le constructeur bâtard ; forcer le consommateur de ThingMaker à comprendre IThingSource, comprendre comment ThingMaker interagit avec IThingSource, trouver ou écrire une classe concrète, et ensuite injecter une instance dans leur appel de constructeur.
- Omettre le constructeur bâtard et fournir une fabrique, un conteneur ou une autre classe/méthode d'amorçage séparée ; faire comprendre au consommateur qu'il n'a pas besoin d'écrire son propre IThingSource ; forcer le consommateur de ThingMaker à trouver et à comprendre la fabrique ou l'amorceur et à l'utiliser.
- Garder le constructeur bâtard, permettant au consommateur de "new up" un objet et de l'exécuter, et faire face à la dépendance statique optionnelle sur DefaultThingSource.
Bon sang, le numéro 3 a l'air séduisant. Y a-t-il une autre option, meilleure ? #1 ou #2 ne semblent pas en valoir la peine.