Visual C# 2012 Grundkurs

Container

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Container ermöglichen es, Anwendungen, welche systematisch mit Interfaces separiert wurden, zu konfigurieren und für verschiedene Zwecke einzusetzen.

Transkript

In diesem Abschnitt möchte ich sie auf eine Möglichkeit hinweisen, die sich Ihnen eröffnet, wenn Sie systematisch Ihre Programmteile mit Interfaces separieren und diese Möglichkeit, das ist die Verwendung von "Containern". Wir sehen hier, diese Klasse Abgleichperformer, die einen Abgleich von Informationen vornimmt, von Dateien und Datensätzen und dazu eigentlich nur relativ wenig Code benötigt. Einfach deswegen, weil die Aufgaben, die damit zusammen hängen, einfach geschickt an verschiedene Objekte delegiert werden. Diese Objekte kommen hier, als Interface-Typen eben in den Konstruktor der Klasse und können dann verwendet werden. Und man sieht schon, dass jetzt hier diese Konstruktor-Parameterliste doch etwas länglich wird und in größeren Systemen, da ist die ganze Geschichte ja noch ein bisschen umfangreicher, weil ja dann-- Diese Verschachtelung der Delegierung wird ja immer tiefer. Wenn man jetzt versuchen würde, alle beteiligten Interfaces durch die einzelnen Ebenen mit durchzuschleifen, das könnte dann relativ große Parameterlisten geben und auch, sagen wir einmal, komplexe Szenarien ergeben. Und um dem vorzubauen und da ein bisschen eine Ordnung auch in diese ganze Konfiguration reinzubringen, gibt es sogenannte Container. Das habe ich jetzt hier einmal in dieser Klasse Abgleichservice gezeigt. Und zwar dieser Abgleich-Performer, das ist ja die Klasse, die die eigentliche Arbeit tut. Und der Abgleichservice ist jetzt einfach nur eine Klasse, die diesen Performer aufruft. Und bevor das getan wird-- Hier wird er angelegt, der Performer und hier wird diese Replikation aufgerufen. Dazwischen erzeugt man so diese ganze Parameterliste und davor tut man etwas, man legt einen Container an. Jetzt ist die Frage, wo kommt dieser Container her? Der Container kommt in diesem Falle von dem Framework Unity, es gibt aber etliche Frameworks die Container zur Verfügung stellen. Ich habe mich in dem Fall für Unity entschieden, weil ich damit schon mal gearbeitet habe und damit gute Erfahrung gemacht habe. Unity ist im übrigen ein Microsoft-Projekt, für das es auch einen Quellcode gibt und Sie können Unity hier bei der Microsoftseite runter laden. Im Augenblick ist es die Version 2.1, eine neue Version ist in der Entwicklung. Dieses Unity habe ich mir also heruntergeladen, installiert und es gibt dann ebene so eine Unity DLL, die bindet man ein und dann kann man diesen Unity Container benutzen, diese Klasse Unity Container. Unter anderem, es gibt da sehr viele Möglichkeiten, die sie mit so Unity Containern haben und die einfachste Möglichkeit, so einen Container zu benutzen, ist, dass man in dem Container Instanzen registriert. Und zwar sage ich: Immer dann, wenn jemand bei diesem Container einen ITraceListener abrufen möchte, also ein Objekt vom Typ ITraceListener, dann gib ihm dieses Objekt. Da lege ich jetzt ein konkretes Objekt an und kann dann dieses Objekt eben in dem Container registrieren. Das ist alles noch relativ simpel. Aber wenn ich jetzt bei diesem Container schon einige Objekte registriert habe, dann kann ich nämlich auch solche Dinge hier machen, dass ich sage: O.K., wann immer jemand ein ICache Database Interface abruft, dann gib ihm ein Cache Database Objekt. Und dieses Cache Database, diese Klasse, die erwartet ja jetzt ihrerseits Implementierungen von Interfaces und diese Implementierungen, die kann ich jetzt ihrerseits hier aus diesem Container herausziehen und dazu nehme ich die Methode Resolve. Also ich rufe von einem Container die Methode Resolve auf, das ist eine generische Methode, ich muss also den Typ angeben, dessen, was ich da eben auflösen möchte und dann gibt mir der Container tatsächlich das Objekt zurück, von dem was ich da auflösen möchte und auf die Art und Weise könnte ich es mir jetzt hier eigentlich sparen diese ganzen Objekte als Instanzen zu übergeben, sondern im Grunde genommen könnte ich auch einfach nur den Container übergeben und dann müsste ich halt eben diese Abgleich-Performer-Klasse hier so umschreiben, dass die Parameterliste eben nur noch den Container übernimmt. Also hier ein Unity Container. Das muss ich dann eben hier noch auflösen, damit der Unity Container hier bekannt ist. Und jetzt müsste ich halt hier von dem Container die entsprechenden Typen abfragen. Also container.resolve, das ist der Information Service, also I Information Service. Dann hier container.resolve, I Diff Generator. Ich denke, ohne dass jetzt im Einzelnen auszukodieren, verstehen Sie, worauf ich hinaus will. Statt also durch längliche Parameterlisten von Konstruktoren irgendwelche Objekte in der Gegend herumzuschaufeln, kann ich jetzt auch einfach meinen Unity Container herumreichen im System und jeder Beteiligte kann sich aus diesem Unity Container das herausziehen, was er grade zur Implementierung seiner Aufgaben braucht. Und das Gleiche gilt jetzt natürlich auch für Tests in der Reihe, wo dann in den Container, nicht etwa irgendwelche konkreten Implementierungen der Interfaces gesteckt werden, sondern wo ich eben dann Mock-Implementierungen reinstecken kann. Hier in diesem Abgleichservice habe ich ja konkrete Implementierungen registriert und im Fall von so einem Test-Assembly, wo ich also Testmethoden drin habe, da könnte ich jetzt ebenfalls einen Container anlegen, in den so Mock-Objekte reinstecken und dann am Ende diesen Abgleichperformer aufrufen, einen Abgleich anstoßen, wo dann nur ganz bestimmt Teile der Funktionalität tatsächlich aus der Implementierung stammen und der Rest quasi weggemockt wird. Also diese Container sind eine extrem leistungsfähige Angelegenheit, wobei sie auf der anderen Seite relativ wenig Ressourcen brauchen. Also die Container sind schmal, sind Klassen, die sehr klein sind und die letztendlich keine Laufzeit benötigen, weil wenn man erst einmal die Implementierungen rausgezogen hat, aus diesem Container, dann arbeiten diese Implementierungen genauso, wie wenn ich irgendeine Klasse direkt angelegt hätte. Dieser Abschnitt über Container endet also mit einer Aufforderung. Setzen Sie sich mit Containern auseinander! Setzen Sie sich mit Mock-Frameworks auseinander und fangen Sie an, Ihre Applikationen zu zerreißen und mit Interfaces zu kapseln, sodass Sie austauschbare Einheiten erzeugen können!

Visual C# 2012 Grundkurs

Schreiben Sie eigene Programme in C# und lernen Sie dazu alle Schlüsselwörter und die meisten Konstrukte kennen, um sicher mit dieser Programmierspreche umzugehen.

7 Std. 1 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!