J'ai refactorisé un système existant pour utiliser l'injection de dépendances, et ce travail s'est bien déroulé.
Après un certain temps, j'ai remarqué qu'un grand nombre de bibliothèques internes sont devenues dépendantes du framework DI que j'ai utilisé. En conséquence, l'ensemble du projet dépend désormais de ce cadre tiers.
J'ai vu une ironie dans le découplage de toutes les dépendances en les rendant dépendantes d'une bibliothèque partagée.
Ma première réaction a été de créer une bibliothèque d'encapsuleurs autour du framework de dépendance. Par conséquent, je pourrais remplacer ce cadre si nécessaire. Après avoir estimé le travail impliqué, j'ai réalisé que l'API résultante serait similaire au cadre existant, et rendrait donc son remplacement plus difficile. J'ai donc abandonné l'idée.
Ma préoccupation est que le cadre DI que j'utilise devient obsolète ou doit être remplacé.
Existe-t-il un modèle de développement lorsque vous travaillez avec DI qui réduit le couplage entre un projet et le cadre DI?
la source
DIFramework.Get<IService>()
n'est pas réellement une injection de dépendance; c'est un modèle connexe appelé Service Locator. Beaucoup de gens n'aiment pas Service Locator parce qu'il vous couple au framework et parce qu'il est trop facilement abusé (comme Singleton). Martin Fowler a un excellent article sur ces modèles: martinfowler.com/articles/injection.htmlRéponses:
Vous avez parfaitement raison - l'utilisation d'un framework DI rendra très probablement votre code dépendant de cette chose. En fait, cela est trop surprenant, car cela est généralement vrai pour toutes les autres bibliothèques de framework ou de fondation, en particulier lorsque cette bibliothèque prend en charge votre projet avec des fonctionnalités génériques utilisées n'importe où dans votre code. Par exemple, lorsque vous décidez d'utiliser un certain cadre d'interface utilisateur ou un cadre Web, cette décision est difficile à modifier par la suite dès que vous avez créé une certaine quantité de code basé sur cette bibliothèque. Lorsque vous décidez d'utiliser une
String
classe spécifique (peut-être non standard) , vous ne pouvez pas facilement changer cette décision plus tard. Une telle décision est architecturale, c'est comme choisir un certain langage de programmation et essayer de changer cette décision après avoir écrit> 100K lignes de code.Faire en sorte que tout votre code dépende d'une certaine infrastructure peut ne pas être un problème tant qu'il fait ce que vous attendez de lui et tant qu'il est correctement entretenu. Mais cela peut devenir un problème si ce n'est pas le cas. Il existe certaines stratégies pour faire face à cette situation:
choisissez un framework auprès d'un fournisseur en qui vous avez confiance et qui peut vous fournir des mises à jour et des nouvelles versions dans plusieurs années
choisissez un framework open source qui a suffisamment de lignes de code (et une licence appropriée), afin que vous puissiez faire vous-même toute maintenance, étant donné que le fournisseur disparaît du marché
écrivez votre propre cadre
vivre avec la situation tant que le fournisseur est disponible, et quand il disparaît vraiment, choisissez un cadre différent et essayez de créer un adaptateur qui émule l'ancien cadre en utilisant le nouveau
L'idée de créer une bibliothèque de wrapper à l'avance n'est pas nouvelle du tout, mais j'ai rarement vu cela fonctionner, car vous auriez à faire des hypothèses pour une situation future pour laquelle vous ne savez pas si ou quand cela vous frappera, et quoi le "nouveau" cadre ressemblera. D'un autre côté, il y a quelques années, nous avons réussi à échanger une infrastructure d'interface utilisateur complète dans un projet C ++ avec environ 120 Ko de lignes de code en appliquant la stratégie d'adaptateur mentionnée ci-dessus.
la source
L'injection de constructeur ordinaire ne nécessite aucun cadre. La seule chose que vous perdez est la possibilité de centraliser vos dépendances dans un fichier de configuration.
Les conteneurs DI sont un modèle de "logiciel d'entreprise", utilisé lorsque le graphe d'objet est très grand et complexe. Je soupçonne que 95% des demandes ne l'exigent pas.
la source
Je ne pense pas que les frameworks DI puissent devenir obsolètes de si tôt. Que doit-il arriver pour le rendre obsolète?
Je dirais que la DI actuelle est suffisamment mûre et je ne suis pas au courant de grand-chose. Vous n'avez pas spécifié votre langue, donc en parlant de Guice , il est assez non intrusif et fonctionne avec des annotations Java standard (utilise également le leur pour des choses non normalisées, mais vous en avez rarement besoin). Il est open source, largement utilisé et sous licence Apache. Quel pourrait être le problème?
Je suis à peu près sûr que changer le cadre DI serait plus facile que de changer toute autre bibliothèque (par exemple, un changement d'interface signifie beaucoup plus de travail).
la source