Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVC3 und IoC/DI in Multilayer
jt_de
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

MVC3 und IoC/DI in Multilayer

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
GarlandGreene
myCSharp.de - Member



Dabei seit:
Beiträge: 499
Herkunft: Emmerich, NRW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Peter Bucher
myCSharp.de - Experte

Avatar #jVxXe7MDBPAimxdX3em3.jpg


Dabei seit:
Beiträge: 6141
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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

- https://peterbucher.ch/ - Meine persönliche Seite
- https://fpvspots.net/ - Spots für FPV Dronenflüge
private Nachricht | Beiträge des Benutzers
jt_de
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

Danke für eure Vorschläge.
Habe es über die web.config gelöst.
private Nachricht | Beiträge des Benutzers
Rookian
myCSharp.de - Member



Dabei seit:
Beiträge: 25

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers