Laden...

MVC3 und IoC/DI in Multilayer

Erstellt von jt_de vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.303 Views
J
jt_de Themenstarter:in
23 Beiträge seit 2010
vor 11 Jahren
MVC3 und IoC/DI in Multilayer

Hallo liebe Leute,

ich beschäftige mich gerade in einem Projekt mit IoC und DI. Die Anwendung ist (verinfacht dargestellt) in 3 VS-Projekten aufgeteilt.

  1. WebGUI
  2. Business
  3. DataAccess

Die Referenzierung sieht so aus, dass die WebGUI eine Referenz auf den Business-Layer besitzt und der wiederum auf den DataAccess.

Ich habe mir nun einige Unity Beispiele für MVC angeschaut, dort werden die Klassen im Bootstrapper innerhalb der WebGUI registiert. Aber das hat dann auch die Folge, dass das WebGUI Projekt das DataAccess Projekt kennen muss, weil im Business-Layer einige Klassen injektziert werden soll.

Ist das ein Problem oder ist das so gewollt?

G
497 Beiträge seit 2006
vor 11 Jahren

am einfachsten kann man in solchen Fällen im Businesslayer eine eigene Initialisierung implementieren. Die muss dann nur bei der Initialisierung des Containers berücksichtigt werden. Du könntest z. B. ein eigenes Interface erstellen, das nur eine Init()-Methode mit dem erzeugten Container als Parameter entgegennimmt. Dann registrierst du die Implementierung(en, könnten ja mehrere sein) bei der Container-Initialisierung, lässt dir sofort eine Liste alle Implementierungen auflösen und rufst die Init()-Methode jeder Implementierung auf. Damit hat dein WebGUI-Projekt keinen direkten Verweis auf das DataAccess-Layer und kann trotzdem darin enthaltene Komponenten auflösen.

Wenn du jetzt auch im DataAccess-Layer eigene Interfaces und Komponenten hast, die du auch im Businesslayer nicht sehen kannst, kannst du dasselbe Spielchen auch mit dem DataAccess-Layer machen, indem du in der Initialisierung im Businesslayer auf dieselbe Art und Weise konstruierst.

5.941 Beiträge seit 2005
vor 11 Jahren

Hallo jt_de

Das ist normal, wenn du die Registrierungen per Code vornimmst kommst du nicht darum.
Mit XML-Registrierung kommst du drum rum und hättest nur die Interfaces referenziert.

Es ist also meistens nicht so wichtig.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

J
jt_de Themenstarter:in
23 Beiträge seit 2010
vor 11 Jahren

Danke für eure Vorschläge.
Habe es über die web.config gelöst.

R
25 Beiträge seit 2008
vor 11 Jahren

Man kann die komplette Registrierungsphase in einem extra Projekt machen. Dieses könnte bspw. "CompositionRoot" oder "DependencyResolver" heißen. In diesem Projekt sind alle Referenzen enthalten und das UI Projekt bleibt schlank.

Das "CompostionRoot" Projekt bekommt zusätzlich ein HttpModul, von dem aus die komplette Registration einmalig angetriggert wird. Damit würde man erreichen, dass die UI auch den CompositionRoot nicht referenzieren muss. Meines Wissens nach kann man hierfür nicht die Global.asax nutzen und muss deswegen auf ein HttpModul zurückgreifen.

Zusammengefasst: Es ist sehr wohl möglich die UI "schlank" zu halten, allerdings muss man schauen, ob sich der Aufwand lohnt.