2009-02-20 12 views
11

Tengo una idea de diseño para un proyecto grande en el trabajo y creo que lo tengo resuelto, pero me encantaría obtener algunos comentarios sobre a) la idea en general, yb) mi propuesta implementación.Agregar una fábrica de controladores a ASP MVC

La idea básica es simple: quiero crear una aplicación ASP MVC que se pueda ampliar en el futuro con controladores y vistas adicionales sin tener que volver a compilar el código. La idea es tener una aplicación MVC con un conjunto básico de características y luego extender la funcionalidad agregando otra 'Application.dll' que contenga controladores, datos y lógica de negocios que sean específicos de esa aplicación. Las vistas simplemente se copiarán en el mismo directorio que la aplicación MVC principal durante la instalación.

El problema es que MVC realiza su enrutamiento en tipos dentro del mismo ensamblado, por lo que incluso si muevo las definiciones de enrutamiento a la base de datos, el MvcHttpHandler no podría enrutar cualquier cosa para el nuevo Dll ya que no "sabe" el controlador escribe en él. Mirando el código MVC, encontré que para cargar los controladores solo están llamando a Activator.CreateInstance que solo se ve en el ensamblado actual.

Mi solución es simple, pero tal vez me falta algo: anularé el MvcHttpHandler reemplazando el ControllerFactory directamente (no estoy seguro de cómo hacerlo) o duplicando esa funcionalidad en una clase derivada. El nuevo código leerá la solicitud e intentará cargar el controlador primero desde el ensamblaje actual y luego desde los extendidos. Una vez que se encuentra el ensamblaje adecuado, usaré CreateInstance y le pasaré ese ensamblaje para obtener el controlador que quiero.

Respuesta

6

El final de this article muestra cómo implementar su propio ControllerFactory. Básicamente, deriva de DefaultControllerFactory y luego lo conecta en Application_Start() en su global.asax.

+0

Gracias, Ben. Eso es lo que estaba buscando. – Gil

1

No hay nada de malo con la idea de una fábrica de controladores, siempre y cuando sea simplemente por flexibilidad más adelante. El problema es cuando carga los controladores con código que pertenece a otras capas, que es una razón por la que podría "necesitar" la flexibilidad de otros controladores. Mientras no estés machacando capas juntas, no veo ningún problema real con la idea de fábrica.

Cuestiones relacionadas