Eine Abhängigkeit ist ein Objekt, von dem ein anderes Objekt abhängt. Bei der Abhängigkeitsinjektion (oder Inversion) handelt es sich im Wesentlichen darum, einem Objekt die benötigten Objekte bereitzustellen, anstatt es das Objekt selbst erstellen zu lassen. Dies ist eine nützliche Technik, die das Testen erleichtert, da Sie damit Abhängigkeiten simulieren können.
Wenn beispielsweise Klasse A eine Methode für Klasse B aufruft und Klasse B eine Methode für Klasse C aufruft, bedeutet dies, dass A von B und B von C abhängt. Mithilfe der Abhängigkeitsinjektion können wir eine Instanz von Klasse C an Klasse B und eine Instanz von B an Klasse A übergeben, anstatt dass diese Klassen Instanzen von B und C erstellen.
Im folgenden Beispiel hängt die Klasse Runner vom Class Logger ab . Beachten Sie, dass im Konstruktor der Klasse Runner eine Instanz von Logger erstellt wird. Es gibt einige Probleme mit diesem Code.
Dadurch wird die Logger-Klasse an den Runner gebunden. Wir können sie nicht durch eine andere Klasse ersetzen. Der Runner muss nicht geändert werden.
Wenn Logger Abhängigkeiten hat, muss Worker diese zuerst konfigurieren Instanziieren Sie den Logger.
Der Test ist schwieriger. Wenn Logger eine ressourcenintensive Klasse ist, z. B. Zugriff Netzwerk oder Dateisystem, was den Test verlangsamen kann. Wir können es nicht einfach ersetzen.
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); } }
Mithilfe der Abhängigkeitsinjektion ändern wir den Konstruktor von Runner so, dass er die Schnittstelle ILogger anstelle eines konkreten Objekts akzeptiert. Wir ändern die Logger-Klasse, um ILogger zu implementieren. Dadurch können wir eine Instanz der Logger-Klasse an den Runner-Konstruktor übergeben. Dies hat den Vorteil, dass wir während des Testens eine TestLogger-Klasse erstellen können, die ILogger implementiert, und diese an den Konstruktor des Runners übergeben können.
Echtzeitdemonstration
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
Das obige ist der detaillierte Inhalt vonAbhängigkeitsinjektion in C# erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!