So machen Sie eine ASP.NET MVC-Site modular

14

Ich bin in der Planungsphase für ein Intranetsystem für Mitarbeiter, das mit ASP.NET MVC 4 erstellt werden soll. Wir möchten, dass die Site aus separaten "Modulen" besteht, von denen jedes eine andere Funktion bietet: Nachrichtenübermittlung, Gehaltsänderungen usw Ich möchte, dass diese Module zum Zeitpunkt der Kompilierung aktiviert oder deaktiviert werden können. Auf der Homepage wird eine Art Navigation angezeigt, die auf jedes geladene Modul verweist.

Das ist bisher einfach, aber ich möchte nicht, dass die Navigationsfunktion vorher etwas über die Module weiß. Mit anderen Worten, ich möchte, dass die Module dynamisch erkennbar sind. Ich möchte in der Lage sein, den Code für ein neues Modul zu schreiben und dann einen Link zur Navigationsleiste hinzuzufügen, ohne dass sich der Code an einer anderen Stelle in der Quelle ändert. Jedes Modul sollte eine Möglichkeit haben, sich in der Navigationsleiste zu registrieren, und - was noch wichtiger ist - dies sollte für jedes Modul beim Laden durchgeführt werden.

Ich bin der Meinung, dass dies die Nutzung der MVC-Bereiche ausschließt, da diese für den Fall konzipiert sind, dass das Layout der Website im Voraus bekannt ist. MEF scheint angebracht zu sein, obwohl die Kombination von MEF und MVC anscheinend gemischte Erfolge hatte. Ist MEF tatsächlich der richtige Weg, um hierher zu kommen, oder gibt es einen besseren Weg, um das zu erreichen, was ich brauche?

bdesham
quelle
Gute Frage, ich habe das Gefühl, dass sich Ihre Lösung wahrscheinlich um die Reflexion drehen wird. Sie können beim Erstellen Ihrer Elemente weiterhin Bereiche verwenden, aber für Ihre Methode zum Erstellen des Menüs muss die Reflektion verwendet werden, um alle Ihre Typen abzurufen (um das Ändern des Codes zu vermeiden). Was ist, wenn alle dieselbe Schnittstelle implementieren? IModule-Schnittstelle. Sie könnten dann alle Erben der Schnittstelle finden alle Module , die Sie benötigen Link zu erreichen, Problem ist dann, wie genau sind Sie zu assoziieren gehen , dass mit einem Link , ohne irgendwelche zusätzlichen Daten? Hmm der Plot verdickt sich ...
Mattytommo
1
Klingt für mich so, als ob Sie ein CMS erstellen möchten, mit der Ausnahme, dass Sie die CMS-Verwaltung nicht innerhalb des CMS, sondern zum Erstellungszeitpunkt durchführen möchten. Was mich zu der Frage führt, warum soll dies zum Zeitpunkt der Erstellung erfolgen?
James P. Wright
@ JamesP.Wright Nun, der Grund, warum ich es zur Erstellungszeit machen wollte, war, dass es einfacher zu sein schien, als diese Funktionalität durch eine Seite auf der Site zu offenbaren. (Außerdem ändert sich die Menge der verwendeten Module selten genug, sodass der zusätzliche Aufwand für diese Art der dynamischen Auswahl nicht erforderlich ist.) Wichtiger als die Auswahl von Modulen zum Zeitpunkt der Erstellung ist jedoch die Fähigkeit der Anwendung, die Module in zu finden der erste Platz, der mehr der Stoß meiner Frage ist.
Bdesham
nopCommerce ( nopcommerce.com/documentation.aspx ) ist zum Teil ein gutes Beispiel für Sie. Schauen Sie sich an, wie Sie ein Plugin schreiben und wie Sie DI ansprechen.
Rui Marques
Zu Forschungszwecken war ich neugierig, was der "gemischte Erfolg" bei der Kombination von MEF mit MVC war. Da Codeplex heutzutage "Leben im Archiv" ist, funktioniert die vom OP bereitgestellte Verknüpfung nicht mehr. Um jemand anderem die Zeit zu ersparen: Suchen Sie mit Strg + F nach 'MEF2 mit MVC4 über Microsoft.Composition' auf dem Diskussions-Tab auf archive.codeplex.com/?p=mef ;)
Kevin,

Antworten:

4

Ich hätte zuerst eine zentralisierte Klasse, die für die App verwendet wird, um kompilierte Module mit einem statischen Konstruktor und einem statischen Member zu registrieren. Liste der Module, die im System vorhanden sind. Die Module haben eine statische Eigenschaft, die angibt, ob es sich um ein Menüelement handelt oder nicht und in welcher Reihenfolge es im Menü angezeigt werden soll.

Jedes Modul hätte einen eigenen statischen Konstruktor, der sich in der zentralisierten Klasse vermerkt, die die Module verfolgt.

Stellen Sie sich dieses System eher wie ein Stechuhrsystem vor, bei dem Mitarbeiter ein- und aussteigen. Dann wissen wir zur Abrechnungszeit, dass alle Mitarbeiter basierend auf dem Zeitpunkt des Eincheckens usw. bezahlt werden müssen.

Reflection kann auch verwendet werden, wenn Sie einen Schnittstellenvertrag für die Module haben, die von diesen geerbt werden müssen, und die Meta-Eigenschaftsinformationen damit verknüpfen.

Ich habe für Warner Brothers Music gearbeitet und ein internes Musikverarbeitungssystem für verschiedene Kodierungsformate erstellt. Ich habe ein generisches Plugin-Modell für die Codierung mit Reflection erstellt, das Vererbung verwendet, damit es mit Reflection typisiert werden kann, um die grundlegenden Meta-Eigenschaften der Klasse abzurufen. Ich habe jedoch nicht versucht, eine statische zentralisierte Klasse zu verwenden. Nur irgendwie willkürlich gedacht, als eine andere Möglichkeit, es zum Spaß zu versuchen.

Ich möchte auch hinzufügen, dass ich MVC verwendet habe, um mehrere Clients mit einer Basisanforderung zu bedienen, aber auch mit erweiterten Funktionen, die Ihren Vorstellungen entsprechen. Stattdessen habe ich die MVC in die Verwendung von App_Code konvertiert, anstatt eine Kompilierung zu erfordern. Es ist einfacher, Dateien auf diese Weise zu verschieben, ohne dass eine zentrale Zusammenstellung erforderlich ist.

Sie können JIT mit einfachem FTP- oder GIT-Push nutzen, anstatt lokal kompilieren und DLLs verschieben zu müssen.

Hier ist ein Link zu diesem Artikel über Stapelüberlauf

Jason Sebring
quelle
Das hört sich ähnlich an, wie ich es mir vorgestellt habe. Das einzige Problem ist, wie bekomme ich die Module überhaupt erst geladen? Durch welchen Mechanismus kann ich jedem von ihnen sagen, dass er sich bei der zentralen Klasse registrieren soll? Hier schien MEF angebracht zu sein.
Bdesham
MEF ist besser. Ich gab Ideen, ohne mich damit zu befassen, aber ich hätte MEF verwendet, wenn es bei diesen Projekten herausgekommen wäre. Scheint eine gute Idee zu sein. Ich verstehe nicht, warum Sie MEF und MVC nicht kombinieren können.
Jason Sebring