Une dépendance est un objet dont dépend un autre objet. L'injection de dépendances (ou inversion) consiste essentiellement à fournir à un objet les objets dont il a besoin au lieu de le laisser construire l'objet lui-même. Il s'agit d'une technique utile qui facilite les tests car elle vous permet de simuler les dépendances.
Par exemple, si la classe A appelle une méthode sur la classe B et que la classe B appelle une méthode sur la classe C, cela signifie que A dépend de B et B dépend de C. En utilisant l'injection de dépendances, nous pouvons transmettre une instance de classe C à la classe B et une instance de B à la classe A, au lieu de laisser ces classes construire des instances de B et C.
Dans l'exemple ci-dessous, la classe Runner dépend de Class Logger . Notez qu'une instance de Logger est créée dans le constructeur de la classe Runner. Il y a quelques problèmes avec ce code.
Cela lie la classe Logger au Runner, nous ne pouvons pas la remplacer par une autre classe, Pas besoin de modifier le Runner.
Si Logger a des dépendances, Worker doit d'abord les configurer Instanciez le Logger.
L'épreuve est plus difficile. Si Logger est une classe gourmande en ressources, comme l'accès réseau ou système de fichiers, ce qui peut ralentir le test. Nous ne pouvons pas le remplacer facilement.
using System; class Program{ static void Main(string[] args){ var runner = new Runner(); runner.Run(); } } class Runner{ private Logger _logger; public Runner(){ _logger = new Logger(); } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } class Logger{ public void Log(string message){ Console.WriteLine(message); } }
À l'aide de l'injection de dépendances, nous modifions le constructeur de Runner pour accepter l'interface ILogger au lieu d'un objet concret. Nous modifions la classe Logger pour implémenter ILogger. Cela nous permet de passer une instance de la classe Logger au constructeur Runner. L'avantage est que pendant les tests, nous pouvons créer une classe TestLogger qui implémente ILogger et la transmettre au constructeur du Runner.
Démonstration en temps réel
using System; class Program{ static void Main(string[] args){ var logger = new Logger(); var runner = new Runner(logger); runner.Run(); } } class Runner{ private ILogger _logger; public Runner(ILogger logger){ _logger = logger; } public void Run(){ // Do some work _logger.Log("Message to be logged"); } } interface ILogger{ void Log(string message); } class Logger : ILogger{ public void Log(string message){ Console.WriteLine(message); } }
Message to be logged
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!