Cómo hacer que un sitio ASP.NET MVC sea modular

14

Estoy en la etapa de planificación para construir un sistema de intranet para empleados con ASP.NET MVC 4. Nos gustaría que el sitio constara de "módulos" separados, cada uno de los cuales proporciona una característica diferente: mensajes, cambios de nómina, etc. Me gustaría que estos módulos se puedan habilitar o deshabilitar en tiempo de compilación. La página de inicio mostrará algún tipo de navegación que se vinculará a cada módulo que se carga.

Eso es fácil hasta ahora, pero no quiero que la función de navegación tenga que conocer los módulos de antemano. En otras palabras, quiero que los módulos sean dinámicamente detectables; Quiero poder escribir el código para un nuevo módulo y luego agregar un enlace a la barra de navegación sin cambios de código en ningún otro lugar de la fuente. Cada módulo debe tener alguna forma de registrarse en la barra de navegación y, lo que es más importante, esto debe hacerse para cada módulo a medida que se carga.

Creo que esto impide usar las áreas de MVC, ya que están diseñadas para el caso cuando el diseño del sitio se conoce de antemano. MEF parece que podría ser apropiado, aunque las personas parecen haber tenido un éxito mixto al combinar MEF con MVC. ¿MEF es realmente el camino a seguir aquí, o hay una mejor manera de lograr lo que necesito?

Bdesham
fuente
Buena pregunta, tengo la sensación de que su solución probablemente girará en torno al uso de la reflexión. Todavía puede usar áreas cuando cree sus elementos, pero su método de construcción del menú necesitará usar la reflexión para obtener todos sus tipos (para guardar el código cambiante). ¿Qué pasa si todos implementan la misma interfaz IModule interface? A continuación, puede encontrar todos los inheritants de la interfaz para obtener todos los módulos que necesita para enlazar a, el problema es entonces cómo es exactamente lo que va a asociado con un enlace que sin ningún dato adicional? Hmm, la trama se complica ...
mattytommo
1
Me parece que quieres construir un CMS, excepto que en lugar de hacer la administración del CMS desde dentro del CMS, quieres que se haga en el momento de la construcción. Lo que me lleva a la pregunta, ¿por qué quieres que se haga en el momento de la compilación?
James P. Wright el
@ JamesP.Wright Bueno, la razón por la que quería hacerlo en el momento de la compilación fue porque parecía que sería más simple que exponer esta funcionalidad a través de una página en el sitio. (Además, el conjunto de módulos utilizados cambiará raramente lo suficiente como para que la sobrecarga adicional de este tipo de selección dinámica no sea necesaria). Pero en realidad, más importante que seleccionar módulos en el momento de la compilación es la capacidad de la aplicación para encontrar los módulos en El primer lugar, que es más el impulso de mi pregunta.
bdesham
nopCommerce ( nopcommerce.com/documentation.aspx ) es en parte un buen ejemplo de lo que quiere. Eche un vistazo a cómo escribir un complemento y su enfoque para DI.
Rui Marques
Para fines de investigación, tenía curiosidad sobre cuál era el "éxito mixto" al combinar MEF con MVC. Como codeplex es "Vivir en el archivo" hoy en día, el enlace que proporcionó el OP ya no funciona. Para ahorrar tiempo a otra persona: busque con ctrl + f 'MEF2 con MVC4 a través de Microsoft.Composition' en la pestaña de discusión en archive.codeplex.com/?p=mef ;)
Kevin

Respuestas:

4

Primero tendría una clase centralizada que se usa para que la aplicación registre módulos compilados con un constructor estático y una lista de módulos miembro estáticos que estaban en el sistema. Los módulos tendrían una propiedad estática que indica si es un elemento de menú o no y en qué orden debería aparecer en el menú.

Cada módulo tendría su propio constructor estático que se notaría en la clase centralizada que realiza un seguimiento de los módulos.

Piense en este sistema más como un sistema de reloj de tiempo en el que los empleados entran y entran. Luego, a la hora de la nómina, sabemos pagar a todos los empleados en función de quién registró, etc.

La reflexión también se podría usar si tiene un contrato de interfaz en los módulos que deben heredar de esa información de meta propiedades.

Trabajé para Warner Brothers Music e hice un sistema interno de procesamiento de música para diferentes formatos de codificación. Hice un modelo de complemento genérico para codificar con reflexión que usaba herencia para que pudiera ser encasillado con reflexión para obtener las meta propiedades básicas de la clase. Sin embargo, no he intentado usar una clase estática centralizada. Simplemente pensé en eso al azar como otra forma de intentar divertirnos.

También agregaría que he usado MVC sirviendo a múltiples clientes con una línea base de requisitos, pero también con características mejoradas similares a lo que está tratando de hacer. En cambio, convertí el MVC para usar App_Code en lugar de requerir una compilación. Es más fácil sacar archivos de esta manera sin necesidad de una compilación centralizada.

Puede aprovechar JIT con FTP simple o GIT push en lugar de tener que compilar localmente y enviar DLL.

Aquí hay un enlace a ese artículo sobre desbordamiento de pila

Jason Sebring
fuente
Eso suena similar a lo que estaba imaginando. El único problema es, ¿cómo puedo cargar los módulos en primer lugar? ¿Por qué mecanismo les digo a cada uno de ellos que se registren en la clase central? Aquí es donde MEF parecía que podría ser apropiado.
bdesham
MEF es mejor. Estaba dando ideas sin analizarlo, pero hubiera usado MEF si hubiera estado disponible cuando hice esos proyectos. Parece una buena idea. No veo por qué no puedes combinar MEF y MVC.
Jason Sebring