Inversion der Kontrolle
Eine kurze Zusammenfassung (viel mehr lesen ist dieses Thema verfügbar, und ich empfehle sehr, mehr zu lesen) ...
Die Unity von Microsoft aus dem Team von Enterprise Patterns and Practices ist ein Inversion of Control Container-Projekt oder kurz IoC. Genau wie Castle Windsor, StructureMap, etc. Diese Art der Entwicklung wird auch in lahmen Begriffen als lose Kopplung Ihrer Komponenten bezeichnet.
IoC enthält ein Muster für Dependency Injection Ihrer Objekte, in dem Sie auf eine externe Komponente angewiesen sind, um die Abhängigkeiten innerhalb Ihrer Objekte zu verkabeln.
Zum Beispiel können Sie, anstatt auf statische Manager zuzugreifen (die für einen Komponententest nahezu unmöglich sind), ein Objekt erstellen, das auf einer externen Abhängigkeit basiert, nach der zu handeln ist. Nehmen wir einen Postdienst, in dem Sie auf die Datenbank zugreifen möchten, um einen Post zu erhalten.
%Vor%Dieses PostService-Objekt hat jetzt eine externe Abhängigkeit von IPostRepository. Beachten Sie, dass keine konkreten und keine statischen Manager-Klassen verwendet werden. Stattdessen haben Sie eine lose Kopplung einer einfachen Schnittstelle - die Ihnen die Möglichkeit gibt, alle Arten konkreter Klassen, die IPostRepository implementieren, zu verkabeln.
Der Zweck von Microsoft Unity besteht darin, das IPostRepository für Sie automatisch zu verbinden. Sie müssen sich also nie Sorgen machen:
%Vor%Oben sehen Sie, wo Sie zwei konkrete Klassen implementieren müssen, PostRepository () und PostService (). Das ist eng mit Ihrer Anwendung verbunden, um diese exakten Instanzen zu fordern / zu erfordern, und macht es sehr schwierig, Komponententests durchzuführen.
Stattdessen würden Sie Unity in Ihrem Endpunkt verwenden (den Controller in MVC oder Code hinter ASPX-Seiten):
%Vor%Beachten Sie, dass in diesem Beispiel keine Betons verwendet werden (mit Ausnahme von UnityContainer und Post)! Keine Betons der Dienste und kein Repository. Das ist lose Kopplung vom Feinsten.
Hier ist der wahre Kicker ...
Unity (oder ein beliebiges IoC-Containerframework!) prüft IPostService auf Abhängigkeiten. Es wird sehen, dass es auf eine Instanz von IPostRepository angewiesen ist (hängt davon ab). Also geht Unity in seine Objekt-Map und sucht nach dem ersten Objekt, das IPostRepository implementiert, das beim Container registriert wurde, und gibt es zurück (d. H. Eine SqlPostRepository-Instanz). Das ist die wahre Stärke hinter IoC-Frameworks - die Fähigkeit, Dienste zu inspizieren und Abhängigkeiten automatisch zu verkabeln.
Ich muss meinen Blogpost über die Vergleiche von UNity vs Castle vs StructureMap abschließen. Ich bevorzuge Castle Windsor aufgrund seiner Konfigurationsdateioptionen und Erweiterungspunkte persönlich.
Der Unity Application Block wird für die Dependenz von Abhängigkeiten verwendet. Ich denke, die beste einfache Definition für DI ist von diese Frage
Wenn Sie Dinge für sich selbst aus dem Kühlschrank holen, können Sie Probleme verursachen. Vielleicht lässt du die Tür offen, vielleicht bekommst du etwas, was Mama oder Papa nicht haben wollen. Vielleicht suchen Sie sogar nach etwas, das wir nicht haben oder das abgelaufen ist.
Was Sie tun sollten, ist eine Notwendigkeit zu sagen, "Ich brauche etwas zu trinken mit Mittagessen", und dann werden wir sicherstellen, dass Sie etwas haben, wenn Sie sich zum Essen setzen.
Also für ein Beispiel,
%Vor% Dies gibt "Limonade" aus, weil wir Drink
als Abhängigkeit definiert haben.
Soweit es praktisch ist, ist Dependency Injection wirklich toll, wenn Sie Abhängigkeiten für andere Objekte haben und nicht möchten, dass der Entwickler sie manuell setzen muss. So einfach ist das. Es ist auch großartig zum Spotten. Das am häufigsten verwendete Beispiel, das ich verwenden kann, ist eine Datenebene zu verspotten. Manchmal ist die Datenbank nicht bereit. Anstatt die Entwicklung zu stoppen, habe ich eine falsche Ebene, die gefälschte Daten zurückgibt. Das Datenobjekt wird über DI angesprochen und kann so konfiguriert werden, dass Objekte zurückgegeben werden, die auf die falsche Ebene oder die reale Ebene zugreifen. In diesem Beispiel verwende ich den DI-Container fast als konfigurierbare Fabrikklasse. Weitere Informationen zu Unity MSDN enthält einige großartige Ressourcen Ссылка .
Andere gute DI-Frameworks sind Spring.NET und Ninject
Tags und Links enterprise-library unity-container