Arbeiten mit dem Unity-Anwendungsblock

Ähnlich wie Castle Windsor und StructureMap ist auch Unity Application Block ein IoC-Container (Inversion of Control). Der Unity Application Block von Microsoft ist ein leichter erweiterbarer Abhängigkeitsinjektionscontainer. Es bietet Unterstützung für Konstruktorinjektion, Eigenschaftsinjektion und Methodenaufrufinjektion. Der Unity Application Block wurde übrigens als Teil der Enterprise Library eingeführt.

Falls Sie nicht wissen, worum es bei Dependency Injection und Inversion of Control geht, finden Sie hier eine kurze Erklärung. Die Abhängigkeitsinjektion ist eine Realisierung des IoC-Prinzips. Sowohl die Inversion der Steuerung als auch die Abhängigkeitsinjektion sind Möglichkeiten, mit denen Sie die Abhängigkeiten zwischen den Komponenten in Ihrer Anwendung aufheben können. Das Prinzip der Abhängigkeitsinjektion besagt, dass die High-Level-Module in einer Anwendung nicht von den Low-Level-Modulen abhängen sollten. Vielmehr sollten beide von Abstraktionen abhängen.

Entwurfsziele für Unity Application Block

Der Unity Application Block ist ein DI-Container (Dependency Injection). Beachten Sie, dass der Unity-Anwendungsblock keine Abhängigkeit vom Konfigurationssystem der Unternehmensbibliothek aufweist. Daher können Sie es als eigenständigen Abhängigkeitsinjektionscontainer ohne die in Ihrem System installierte Unternehmensbibliothek verwenden. Die Entwurfsziele des Unity-Anwendungsblocks umfassen Folgendes:

  1. Förderung eines modularen Aufbaus durch Entkopplung
  2. Bereitstellung eines schnellen, erweiterbaren und leichten Abhängigkeitsinjektionsbehälters
  3. Unterstützung für Erweiterbarkeit durch Erweiterungen
  4. Unterstützung für Attribut-gesteuerte Injektion
  5. Bieten Sie Unterstützung für eine intuitive API, mit der Sie eine Verbindung zum Abhängigkeitsinjektionscontainer herstellen und mit ihm arbeiten können

Anfangen

In diesem Abschnitt erfahren Sie, wie Sie mit der Verwendung des Unity-Anwendungsblocks in unseren Anwendungen beginnen können. Der erste Schritt sollte darin bestehen, den Unity Application Block auf Ihrem System zu installieren. Der einfachste Weg, diese Bibliothek zu installieren, ist über NuGet. Für die Zwecke dieser Abbildung verwenden wir hier ein Konsolenanwendungsprojekt. Gehen Sie folgendermaßen vor, um die erste Anwendung mit dem Unity-Anwendungsblock zu erstellen:

  1. Öffnen Sie die Visual Studio-IDE
  2. Erstellen Sie ein Konsolenprojekt und speichern Sie es unter einem Namen
  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt
  4. Wählen Sie "NuGet-Pakete verwalten ..."
  5. Installieren Sie Unity NuGet Package Manager

Das ist alles, was Sie tun müssen, um die Voraussetzungen für die Verwendung von Unity zu schaffen. Sie können jetzt Unity Application Block in Ihrem Projekt verwenden.

Erstellen und Auflösen von Objektabhängigkeiten mithilfe des Unity-Containers

Mit dem Unity-Container können Sie Abhängigkeiten von einem bestimmten Objekt einfach auflösen, wie im folgenden Codeausschnitt gezeigt.

IUnityContainer container = new UnityContainer();

container.RegisterType();

container.RegisterType();

Wenn Sie den Typ eines Objekts im Unity-Container registrieren, können Sie die Lebensdauer angeben. Wenn Sie keine angeben, wird die Standardlebensdauer verwendet. Ein Lifetime Manager steuert die Lebensdauer eines registrierten Objekts. Zu den vom Unity-Anwendungsblock unterstützten Typen von Lebensdauermanagern gehören: TransientLifetimeManager, ContainerControlledLifetimeManager, HierarchicalLifetimeManager, PerThreadLifetimeManager und ExternallyControlledLifetimeManager.

Betrachten Sie die folgende Schnittstelle namens ILogger.

public interface ILogger

   {

       string GetLogTypeName();

   }

Die ILogger-Schnittstelle enthält die Deklaration einer Methode namens GetLogTypeName (). Die Klassen FileLoger, DatabaseLogger und EventLogger (siehe unten) implementieren die ILogger-Schnittstelle.

public class FileLogger : ILogger

   {

       public string GetLogTypeName()

       {

           return "File Logger";

       }

   }

   public class DatabaseLogger: ILogger

   {

       public string GetLogTypeName()

       {

           return "Database Logger";

       }

   }

   public class EventLogger: ILogger

   {

       public string GetLogTypeName()

       {

           return "Event Logger";

       }

   }

Die folgende Codeliste zeigt, wie Sie Abhängigkeiten mit UnityContainer auflösen können.

static void Main(string[] args)

{

IUnityContainer container = new UnityContainer();

container.RegisterType();

ILogger iLogger = container.Resolve();

string logType = iLogger.GetLogTypeName();

Console.WriteLine(logType);

Console.Read();

}

Beachten Sie, dass der "Container" im Unity-Anwendungsblock das Objekt ist, mit dem Abhängigkeiten erstellt und eingefügt werden können. Mit der RegisterType-Methode können Sie Typen oder Typzuordnungen im Unity-Container registrieren. Die Resolve () -Methode wird verwendet, um eine konkrete Instanz des Typs zurückzugeben, der für den mit T genannten generischen Typ registriert ist. In dem oben angegebenen Codebeispiel gibt die Resolve () -Methode eine Instanz der FileLogger-Klasse zurück.

Ein alternativer Ansatz zum Festlegen der Unity-Integration ist die Konfiguration. Angenommen, Sie haben in Ihrer Unity-Konfiguration einen Container mit dem Namen Container angegeben, zeigt das folgende Codeausschnitt, wie Sie die LoadConfiguration-Methode für die Containerinstanz in Ihrem Code aufrufen können.

string containerName = "Container";

IUnityContainer container = new UnityContainer().LoadConfiguration(containerName);