asp.net-mvc plugins mef composite

¿Implementando MEF con ASP.NET MVC?



asp.net-mvc plugins (6)

Estoy intentando averiguar si alguien tiene alguna experiencia o idea de usar MEF (Managed Extensible Framework (el nuevo marco de complementos de Microsoft) con ASP.NET MVC. Necesito crear un ASP.NET MVC estándar, que tengo. Pero necesito para ofrecer funcionalidad adicional, es decir, Vistas y Controladores, etc., dependiendo de si agrego un complemento. No necesita compilarse dinámicamente, es decir, el código fuente ... sino un archivo DLL que puse en el sistema ...

¿Hay alguna manera de cargar dinámicamente una DLL cuando se inicia la aplicación, y luego MERECER una VISTA y CONTROLADORES con el sistema principal? No sé si estoy en el camino correcto aquí.

Entonces, supongo que en las vistas "ESTÁNDAR" que vienen con la aplicación, puedo usar "SI LUEGO" para averiguar si un complemento está cargado y MERGE en un control de usuario.

Bueno, estoy hablando en voz alta aquí, pero creo que entiendes a qué me refiero.

¿Algunas ideas?


Esta es una conjetura salvaje. Podría sobrescribir la fábrica de controladores predeterminada con una que use MEF para descubrir IController s. Como las Vistas se descubren por convención, no debería preocuparse por ellas.


Estamos utilizando toneladas de MEF en ASP.NET MVC, aunque la mayoría se encuentra en un nivel por debajo del nivel de controlador, ya que en nuestros módulos de nivel inferior utilizan complementos MEF para verificar permisos y validar datos.

Sin embargo, también usamos un enfoque más composable para nuestros controladores. Las vistas son más complicadas, pero en realidad eliminamos por completo el uso de las vistas regulares de ASP.NET MVC y almacenamos nuestras vistas Razor en fragmentos en una base de datos. Nuestros controladores luego solicitan un motor de plantillas para una vista en tiempo de ejecución y renderizan ContentResult a la respuesta en lugar de devolver View ("Viewname"), etc.

Todos nuestros complementos MEF llevan propiedades de identificación que nos permiten hacer una anulación en cascada en el tiempo de ejecución para descubrir qué plugin / clase se debe usar para un propósito determinado. El ejemplo más fácil de demostrar sería si piensa en una aplicación que tiene una base común, pero se implementa en más de 50 implementaciones que tienen la opción de anular la funcionalidad principal.

Por lo tanto, es posible que tenga algo así como un IUserController que incluye métodos para "Iniciar sesión", "Cerrar sesión", etc.

Además de esa funcionalidad real, agregaríamos una propiedad de GUID de solo lectura a la interfaz llamada "SiteId". Cada implementación codificaría el SiteId para el que fue diseñado. Para la implementación "predeterminada" en el código central, devolvería "Guid.Empty".

Luego, cuando invocamos MEF y buscamos qué implementación de IUserController usar, haríamos una ImportMany de todas ellas en una lista y luego usamos LINQ para consultar las propiedades y determinar cuál usar:

var _currentUserController = _availableUserControllers.FirstOrDefault( c=>c.SiteId == AppSettings.SiteId); if(_currentUserController == null){ //There is no site-specific override _currentUserController = _availableUserControllers.FirstOrDefault( c=>c.SiteId == Guid.Empty); }

Para hacer esto con los controladores, su mejor opción es observar algunas de las implementaciones de fábricas controladoras basadas en MEF en la web.

Sin embargo, como dije, hacemos casi todo esto en un nivel más bajo y nuestros módulos o los controladores hacen este tipo de búsqueda para determinar qué complementos ejecutar.





un poco de suerte con eso? Estaba leyendo this y creo que eso es lo que estás buscando.
Tengo exactamente cero XP con MEF, pero parece prometedor. Espero poder juntar algunas horas de tiempo libre en casa para experimentar con eso. Sería muy útil crear algún tipo de "marco" de MVC modular de esa manera.

En cuanto al proyecto actual en el que estoy trabajando, tengo el siguiente problema: varios sitios con las mismas vistas, solo otros archivos CSS. Actualmente tengo que duplicar las vistas que resultan en un problema de mantenimiento.
Espero poder poner estos puntos de vista en un lugar central usando MEF.