Ich habe einfachere Anwendungen wie Nerddinner und ContactManager sowie kompliziertere wie Kigg betrachtet. Ich verstehe die einfacheren und jetzt möchte ich die komplexeren verstehen.Meine MVC auf die nächste Ebene bringen: DI und Unit of Work
Normalerweise haben die einfacheren Anwendungen Repository-Klassen und -Schnittstellen (so lose wie möglich) über LINQtoSQL oder das Entity Framework. Die Repositories werden von den Controllern aufgerufen, um die notwendigen Datenoperationen durchzuführen.
Ein gemeinsames Muster, das ich sehe, wenn ich kompliziertere Anwendungen wie KIGG oder Oxite ist die Einführung prüfen (ich nur der Oberfläche kratzen hier, aber ich habe irgendwo beginnen):
- IOC DI (in KIGG des Fall Unity)
- Web anfordern Lebensdauer Manager
- Arbeitseinheit
Hier sind meine Fragen:
Ich verstehe, dass Sie etwas Unity verwenden müssen, um wirklich eine lose gekoppelte Anwendung zu haben. Es scheint aber auch so zu sein, dass Sie in dem Moment, in dem Sie Unity in den Mix einführen, auch einen Web Request Lifetime Manager einführen müssen. Warum das? Warum haben Beispielanwendungen wie Nerddinner keinen Web Request Lifetime Manager? Was genau macht es? Ist es eine spezielle Einheit?
Ein zweites Muster, das ich bemerke, ist die Einführung der Einheit der Arbeit. Noch einmal dieselbe Frage: Warum benutzt Nerddinner oder ContactManager nicht Unit of Work? Stattdessen verwenden diese Anwendungen die Repository-Klassen oberhalb von Linq2Sql oder Entity Framework, um die Datenbearbeitung durchzuführen. Keine Spur von einer Arbeitseinheit. Was genau ist es und warum sollte es verwendet werden?
Dank
Unten finden Sie ein Beispiel für DI in Nerddiner am DinnersController Ebene:
public DinnersController()
: this(new DinnerRepository()) {
}
public DinnersController(IDinnerRepository repository) {
dinnerRepository = repository;
}
So ist mir, dass der Controller „Eigentümer“ der DinnerRepository wegen des ersten Konstruktor Recht zu übernehmen und es wird daher von der Lebensdauer des Controllers abhängen, da er dort deklariert ist?
Vielen Dank! Das hat geholfen. Ich habe meine Frage unten bearbeitet. Ist das das, was Sie meinen, wenn Sie sagen, dass der Controller die Referenz zum Repository/Datenkontext besitzt? – Thomas
Nicht genau. In NerdDinner verwenden sie einen zusätzlichen Konstruktor, der IDinnerRepository annimmt, um Komponententests einfacher zu machen. Aber ja, es ist immer noch entweder Controller (parameterloser Konstruktor) oder Tests, die das Repository-Objekt erstellen und besitzen. Sie sterben beide und es gibt keine anderen Benutzer des Repositories; so ist das Leben einfach. Übrigens ist eine solche Technik schlecht; Sie können mehr darüber hier lesen: http://www.losetechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-pendency-injection-in-nerddinner.aspx (wie auch als Google für "IoC des armen Mannes"). – queen3
Jimmy Bogards Argument, dass dies ein eklatantes Beispiel für den "IoC des armen Mannes" sei, ist hier extrem gut. Die Kommentare sind auch gut. Auf jeden Fall eine Lektüre wert. –