Ho eseguito una serie di progetti LOB ASP.NET MVC (MVC5) e vorrei ristrutturare il modo in cui gestisco alcune cose per un nuovo progetto. In particolare, ho un componente che voglio riutilizzare in più punti dell'applicazione.
Metodo corrente
Diciamo che ho un'app che gestisce la gestione dei casi dei pazienti. Una parte di questo sarebbe mantenere in esecuzione un elenco di note / attività sciolte sul paziente. Tradizionalmente lavorerei su questi come parte di qualunque area primaria gestiremmo la voce delle note: diciamo che andrebbero nella porzione CaseManager
dell'interfaccia utente e come tali rientrerebbero nel contesto all'interno di CaseController
(e successivamente, anche il modello e le viste sarebbero naturalmente "adiacenti" (per mancanza di parole migliori) a quel controller.
Altrove, potrei voler visualizzare un elenco / riassunto di note e magari un popup rapido o altro. Questo in genere verrebbe gestito separatamente dall'implementazione di CaseController di cui sopra.
Cosa mi piacerebbe fare
Ora, vorrei prendere questo editor / display di Notes e trattarlo come una risorsa incorporata in qualsiasi altra visualizzazione che voglio. Creerò quindi un controller Notes con specifici modelli Notes e viste Notes (per conservare tutte quelle cose piacevolmente incapsulate), quindi quando voglio visualizzare il componente "note" nell'app da qualche parte, vorrei semplicemente inviare una richiesta a il controllore Notes di conseguenza.
Come tale, il mio CaseManager è ora "vincolato" al mio CaseController, ma quando l'utente fa clic sulla scheda Note, voglio attivare un'istanza di NotesController, passarla a un parametro rilevante o due, quindi lasciare che NotesController faccia il sollevamento pesante e restituire la risposta.
Altrove - non nel CaseManager - Potrei voler incorporare in modo simile questo componente Notes e gestirlo allo stesso modo: delegare l'elaborazione a una nuova istanza di NotesController e lasciare che faccia la sua cosa.
Cosa ho fatto
Precedentemente, ho gestito scenari "leggeri" come questo usando httpContext.Server.TransferRequest
, che funziona molto bene nello spostare silenziosamente la richiesta e il suo contesto in una nuova azione del controller.
Ho seguito lo stesso percorso per quello che mi piacerebbe fare ora - quindi il mio metodo di tabulazione di CaseController ora dice return MyTransferResultWrapper("/Notes/?id=1234");
Funziona, ma ...
Cosa non mi piace
... sembra sbagliato. Non ha comunque giusto . Funziona, ma mi odora, per ragioni che non riesco a mettere bene le dita. Sembra che se dovessi evolvere questo approccio come una "tattica fondamentale" per affrontare questo in questa nuova applicazione (che ha molti di questi casi di riutilizzo), starei davvero manipolando e lavorando contro la corrente in termini per aggirare i contesti dei controller e in generale solo fare cose che forse il framework non è mai stato realmente progettato per gestire.
Qualcuno potrebbe essere in grado di offrire qualche consiglio su un approccio sonoro per questo tipo di cose? Molte grazie ...