Come rendere modulare un sito ASP.NET MVC


14

Sono in fase di pianificazione per la creazione di un sistema Intranet per i dipendenti con ASP.NET MVC 4. Vorremmo che il sito fosse costituito da "moduli" separati, ognuno dei quali fornisce una funzionalità diversa: messaggistica, modifiche del libro paga, ecc. Vorrei che questi moduli potessero essere abilitati o disabilitati in fase di compilazione. La homepage mostrerà un tipo di navigazione che si collegherà a ciascun modulo che viene caricato.

Finora è facile, ma non voglio che la funzione di navigazione debba prima conoscere i moduli. In altre parole, voglio che i moduli siano dinamicamente individuabili; Voglio essere in grado di scrivere il codice per un nuovo modulo e quindi aggiungere un collegamento alla barra di navigazione senza modifiche al codice in nessun altro punto della fonte. Ogni modulo dovrebbe avere un modo per registrarsi con la barra di navigazione e, cosa più importante, questo dovrebbe essere fatto per ogni modulo quando viene caricato.

Credo che ciò precluda l'utilizzo delle aree MVC, dal momento che quelle sono progettate per il caso in cui il layout del sito è noto in anticipo. MEF sembra che potrebbe essere appropriato, anche se le persone sembrano aver avuto un successo misto nel combinare MEF con MVC. MEF è davvero il modo di andare qui o c'è un modo migliore per realizzare ciò di cui ho bisogno?


Bella domanda, ho la sensazione che la tua soluzione ruoterà probabilmente usando la riflessione. Puoi comunque usare le aree quando crei i tuoi oggetti, ma il tuo metodo di costruzione del menu dovrà usare la riflessione per ottenere tutti i tuoi tipi (per salvare la modifica del codice). Che dire se implementano tutti la stessa interfaccia interfaccia IModule. È quindi possibile trovare tutte inheritants dell'interfaccia per ottenere tutti i moduli necessari al link, problema poi è esattamente come hai intenzione di associare che con un collegamento senza alcun dati aggiuntivi? Hmm la trama si infittisce ...
Mattytommo,

1
Mi sembra che tu voglia costruire un CMS, tranne che invece di fare l'amministrazione CMS dall'interno del CMS, vuoi che sia fatto al momento della compilazione. Il che mi porta alla domanda, perché vuoi che sia fatto al momento della costruzione?
James P. Wright,

@ JamesP.Wright Bene, il motivo per cui volevo farlo in fase di costruzione era solo perché sembrava che sarebbe stato più semplice che esporre questa funzionalità attraverso una pagina del sito. (Inoltre, l'insieme di moduli utilizzati cambierà abbastanza raramente che l'overhead aggiunto di questo tipo di selezione dinamica non è necessario.) In realtà, più importante della selezione dei moduli in fase di compilazione è la capacità dell'applicazione di trovare i moduli in il primo posto, che è più il filo conduttore della mia domanda.
bdesham,

nopCommerce ( nopcommerce.com/documentation.aspx ) è in parte un buon esempio di ciò che desideri. Dai un'occhiata a come scrivere un plugin e il loro approccio per DI.
Rui Marques,

Ai fini della ricerca ero curioso di sapere quale fosse il "successo misto" nel combinare MEF con MVC. Poiché codeplex è "Vivere nell'archivio" al giorno d'oggi, il collegamento fornito dall'OP non funziona più. Per risparmiare qualcun altro il tempo: cerca con Ctrl + F "MEF2 con MVC4 tramite Microsoft.Composition" nella scheda di discussione su archive.codeplex.com/?p=mef ;)
Kevin

Risposte:


4

Vorrei prima avere una classe centralizzata che viene utilizzata per l'app per registrare moduli compilati con un costruttore statico e un elenco di moduli statici membro che erano nel sistema. I moduli avrebbero una proprietà statica che indica se è una voce di menu o meno e quale ordine dovrebbe apparire nel menu.

Ogni modulo avrebbe un proprio costruttore statico che si noterebbe nella classe centralizzata che tiene traccia dei moduli.

Pensa a questo sistema più come a un sistema di orologio in cui i dipendenti entrano e si collegano. Quindi al momento della gestione stipendi, sappiamo di pagare tutti i dipendenti in base a chi ha effettuato l'accesso, ecc.

Reflection potrebbe anche essere utilizzato se si dispone di un contratto di interfaccia sui moduli che devono ereditare da tali informazioni sulla meta proprietà.

Ho lavorato per Warner Brothers Music e ho realizzato un sistema di elaborazione musicale interno per diversi formati di codifica. Ho creato un modello di plug-in generico per la codifica con reflection che utilizzava l'ereditarietà in modo che potesse essere tipizzato con reflection per ottenere le meta proprietà di base della classe. Non ho provato a usare una classe centralizzata statica. Solo un po 'di pensarlo a caso come un altro modo di provare per divertimento.

Vorrei anche aggiungere che ho usato MVC per servire più clienti con una base di requisiti ma con funzionalità avanzate simili a quelle che stai cercando di fare. Invece ho convertito il MVC in usando App_Code piuttosto che richiedere una compilazione. È più facile estrarre i file in questo modo senza bisogno di una compilazione centralizzata.

È possibile sfruttare JIT con il semplice push FTP o GIT piuttosto che dover compilare localmente e spingere DLL in giro.

Ecco un link a quell'articolo sullo stack overflow


Sembra simile a quello che stavo immaginando. L'unico problema è, come posso caricare i moduli in primo luogo? Con quale meccanismo dico a ciascuno di loro di registrarsi con la classe centrale? Questo è dove MEF sembrava essere appropriato.
bdesham,

MEF è migliore. Stavo dando idee senza esaminarle, ma avrei usato MEF se avessi avuto questa opzione se fosse uscito quando ho realizzato quei progetti. Sembra una buona idea. Non vedo perché non puoi combinare MEF e MVC.
Jason Sebring,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.