Was ist spätes Binden und wie wird es in .NET erreicht?

 C Programming >> C-Programmierung >  >> Tags >> .NET
Was ist spätes Binden und wie wird es in .NET erreicht?

Hallo Freunde, in diesem Artikel helfe ich euch mit Codebeispielen in C# das Late Binding beim Programmieren zu verstehen. Die späte Bindung hilft uns, Erweiterbarkeit zu erreichen und Instanzen der Klasse zur Laufzeit zu erstellen. Und Late Binding nutzt Dependency Injection, um die Funktionalität zu erreichen.

Was ist Abhängigkeitsinjektion

Um die späte Bindung zu verstehen und zu verwenden, müssen wir zuerst die Dependency Injection (DI) verstehen. DI wird verwendet, um das Prinzip der Abhängigkeitsinversion zu erreichen. In dem in meinem vorherigen Artikel gezeigten Beispiel habe ich die Abhängigkeitsinjektion für die Methode verwendet.

Um DI zu erreichen, erstellen wir eine abstrakte Klasse oder Schnittstelle und die Instanz dieser abstrakten Klasse oder Schnittstelle wird als Parameter für den Konstruktor oder die Methode beibehalten.

Codebeispiel für Abhängigkeitsinjektion

In diesem Codebeispiel zeige ich Ihnen, wie wir eine Abhängigkeitsinjektion erreichen können, um das erste „Hello World“-Programm zu schreiben, das jeder gerne schreibt.

Wie Sie im folgenden Code sehen können, schreibe ich nicht einfach „Hello World“. Stattdessen habe ich Dependency Injection verwendet und eine Containerschnittstelle namens IMessageWriter erstellt. Diese Schnittstelle kann erweitert werden, um in jedes Ausgabeformat zu schreiben.

        private static void Main()
        {
            IMessageWriter writer = new ConsoleMessageWriter();
            var salutation = new Salutation(writer);
            salutation.Exclaim();

            Console.ReadLine();
        }

Schauen wir uns den ConsoleMessageWriter im folgenden Code an. Diese Klasse wird verwendet, um die Nachricht auf der Konsole zu schreiben. Ebenso können Sie DBMessageWriter, TextMessageWriter oder irgendetwas anderes schreiben.

 public interface IMessageWriter
    {
        void Write(string message);
    }
  public class ConsoleMessageWriter : IMessageWriter
    {
        public void Write(string message)
        {
            Console.WriteLine(message);
        }
    }

Jetzt kommt die Implementierung der Kern-Engine unseres Codes, die die Nachricht verarbeitet und schreibt, d. h. die Anredeklasse.

public class Salutation
{
    private readonly IMessageWriter writer;

    public Salutation(IMessageWriter writer)
    {
        if (writer == null)
        {
            throw new ArgumentNullException("writer");
        }

        this.writer = writer;
    }

    public void Exclaim()
    {
        this.writer.Write("Hello World");
    }
}

Diese Klasse nimmt den IMessageWriter als Parameter. Da der Parameter eine Schnittstelle ist, kann die Klasse, die den Parameter implementiert, zur Kompilierzeit übergeben werden, und der Rest wird erledigt. Wie Sie sehen können, ist die Anredeklasse allein dafür verantwortlich, die Nachricht zu drucken. Es besteht keine Notwendigkeit, diese Klasse zu ändern, wenn wir den Nachrichtenschreiber ändern wollen.

Mit dem obigen Codebeispiel haben wir nun viele Vorteile erzielt. Einige davon sind unten aufgeführt. Ich habe diese Vorteile kurz erwähnt und werde die ausführliche Diskussion als zukünftiges Thema behalten.

Vorteil Beschreibung Wann ist es wertvoll?
Spätes Binden Dienste können mit anderen Diensten ausgetauscht werden. Wertvoll in Standardsoftware, aber vielleicht weniger in Unternehmensanwendungen, wo die Laufzeitumgebung in der Regel gut definiert ist
Erweiterbarkeit Code kann auf nicht explizit geplante Weise erweitert und wiederverwendet werden. Immer wertvoll
Parallele Entwicklung Code kann parallel entwickelt werden. Wertvoll in großen, komplexen Anwendungen; nicht so sehr in kleinen, einfachen Anwendungen
Wartbarkeit Klassen mit klar definierten Verantwortlichkeiten sind einfacher zu pflegen. Immer wertvoll
TSTABILITÄT Klassen können Unit-Tests unterzogen werden. Nur wertvoll, wenn Sie Einheiten testen (was Sie wirklich, wirklich sollten)

Was ist spätes Binden und wie wird es erreicht

Wie Sie oben sehen können, muss ich die Implementierung der IMessageWriter-Schnittstelle zur Kompilierzeit übergeben, wenn ich eine neue Möglichkeit zum Ausdrucken der Nachricht bereitstellen möchte. Das Problem bei diesem Ansatz ist, dass ich den Code jedes Mal ändern und kompilieren muss. Führen Sie daher eine weitere Bereitstellung in der Produktion durch.

Um dieses Szenario zu verhindern, kann ich die späte Bindung verwenden, wie im folgenden Code gezeigt.

Ich muss einen Schlüssel in die App.config-Datei einfügen, wie unten gezeigt

    
  

Und ändere meinen Hauptcode wie unten gezeigt

            var typeName = ConfigurationManager.AppSettings["messageWriter"];
            var type = Type.GetType(typeName, true);
            IMessageWriter writer = (IMessageWriter)Activator.CreateInstance(type);
            var salutation = new Salutation(writer);
            salutation.Exclaim();

Der Vorteil des obigen Codes besteht darin, dass die Implementierung des IMessageWriter zur Laufzeit geändert werden kann, ohne dass die Lösung überhaupt kompiliert werden muss.

Der GetType im obigen Code übernimmt den AssemblyQualifiedName der Klasse.

Sie können dasselbe finden, indem Sie den folgenden Code verwenden.

Type t = typeof(ConsoleMessageWriter);
string s = t.AssemblyQualifiedName;

Console.WriteLine("The Assembly qualified assembly name " +  "containing the specified class is {0}.", s);

Schlussfolgerung:

In diesem Artikel habe ich Ihnen gezeigt, wie Sie die späte Bindung in einem .NET-Projekt mit der Sprache C# erreichen. Ich habe Ihnen gezeigt, wie Ihnen die späte Bindung hilft, Abhängigkeitsinjektion zu erreichen.