realidad estoy trabajando en un marco de extensibilidad para usar en la parte superior de ASP.NET MVC. Mi marco de extensibilidad se basa en el famoso contenedor Ioc: Structuremap.
El caso de uso que intento cumplir es simple: crear una aplicación que debe tener alguna funcionalidad básica que se pueda extender para cada cliente (= multi-tenancy). Solo debe haber una instancia de la aplicación alojada, pero esta instancia se puede adaptar para cada cliente sin realizar ningún cambio en el sitio web central.
Me inspiré en el artículo sobre la tenacidad múltiple escrito por Ayende Rahien: http://ayende.com/Blog/archive/2008/08/16/Multi-Tenancy--Approaches-and-Applicability.aspx Otra fuente de inspiración fue el libro de Eric Evans sobre Domain Driven Design. Mi marco de extensibilidad se basa en el patrón de repositorio y el concepto de agregados de raíz. Para poder utilizar el marco, la aplicación de alojamiento debe construirse alrededor de repositorios y objetos de dominio. Los controladores, repositorios u objetos de dominio están vinculados en tiempo de ejecución por ExtensionFactory.
Un complemento es simplemente un asistente que contiene controladores o repositorios u objetos de dominio que respeta una convención de nomenclatura específica. La convención de nomenclatura es simple, cada clase debe ser prefijada por el ID del cliente, por ejemplo: AdventureworksHomeController.
Para extender una aplicación, copie un ensamblaje de complemento en la carpeta de extensión de la aplicación. Cuando un usuario solicita una página en la carpeta raíz del cliente, por ejemplo: http://multitenant-site.com/[customerID]/[controller]/[action] la verificación de marco si hay un complemento para ese cliente en particular y crear instancias de las clases de complemento personalizadas, de lo contrario, carga el valor predeterminado una vez. Las clases personalizadas pueden ser Controladores: repositorios u objetos de dominio. Este enfoque permite extender una aplicación en todos los niveles, desde la base de datos a la UI, a través del modelo de dominio, repositorios.
Cuando desee extender algunas funciones existentes, cree un complemento que contenga subclases de la aplicación principal. Cuando tiene que crear funcionalidades totalmente nuevas, agrega nuevos controladores dentro del complemento. Estos controladores serán cargados por el framework MVC cuando se solicite la url correspondiente.Si desea extender la interfaz de usuario, puede crear una nueva vista dentro de la carpeta de extensiones y hacer referencia a la vista mediante un controlador nuevo o subclasificado. Para modificar el comportamiento existente, puede crear nuevos repositorios u objetos de dominio o subclasificar los existentes. La responsabilidad del marco es determinar qué controlador/repositorio/objeto de dominio debe cargarse para un cliente específico.
Aconsejo echar un vistazo a structuremap (http://structuremap.sourceforge.net/Default.htm) y especialmente en las características de Registry DSL http://structuremap.sourceforge.net/RegistryDSL.htm.
Este es el código que uso en la puesta en marcha de la solicitud de registro de todos los controladores/repositorios enchufables o objetos de dominio:
protected void ScanControllersAndRepositoriesFromPath(string path)
{
this.Scan(o =>
{
o.AssembliesFromPath(path);
o.AddAllTypesOf<SaasController>().NameBy(type => type.Name.Replace("Controller", ""));
o.AddAllTypesOf<IRepository>().NameBy(type => type.Name.Replace("Repository", ""));
o.AddAllTypesOf<IDomainFactory>().NameBy(type => type.Name.Replace("DomainFactory", ""));
});
}
También uso un ExtensionFactory heredando de la System.Web.Mvc. DefaultControllerFactory. Esta fábrica es responsable de cargar los objetos de extensión (controladores/registros u objetos de dominio). Puede plugin de sus propias fábricas registrándolos en el arranque en el archivo Global.asax:
protected void Application_Start()
{
ControllerBuilder.Current.SetControllerFactory(
new ExtensionControllerFactory()
);
}
este marco como un sitio de ejemplo en pleno funcionamiento se puede encontrar en: http://code.google.com/p/multimvc/
sus enlaces no funcionan que estaba esperando para ver lo que construir, no tengo problemas similares con mi proyecto en el que necesito para hacer proyectos enchufable para que pueda añadir/eliminar la funcionalidad bajo demanda. lo mismo que la gente hace en wordpress. – Alok