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?
quelle
Antworten:
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
quelle
Möglicherweise möchten Sie MEF mit MVC verwenden. Dies würde Ihnen die Möglichkeit geben, nach Bedarf hinzuzufügen - mitzunehmen, ohne erneut zu kompilieren oder bereitzustellen. Wie immer ist Scott ein guter Ausgangspunkt: http://www.hanselman.com/blog/ExtendingNerdDinnerAddingMEFAndPluginsToASPNETMVC.aspx
quelle