Cómo: Utilizar MEF con MVC

En este tema se explica cómo crear una aplicación Model-View-Controller (MVC) de ASP.NET que utiliza Managed Extensibility Framework (MEF). Puede utilizar MEF para conectar los modelos, vistas y controladores que constituyen la maquinaria de control de solicitudes de una aplicación MVC. Los objetos específicos de la aplicación que realizan la lógica empresarial de esta se pueden representar como elementos MEF. El motor de composición de MEF proporciona al controlador MVC elementos completos y listos para su uso, y controla automáticamente la eliminación y destrucción de dichos elementos.

En este tema se supone que está familiarizado con los conceptos descritos en Información general de MEF.

Importante

Los procedimientos de este tema requieren Visual Studio 2012 o posterior.

Crear el proyecto de MVC

A partir de Visual Studio 2012, Visual Studio incluye una plantilla que se utiliza para crear una solución de ASP.NET MVC.

Para crear el proyecto de MVC

  1. En Visual Studio, cree un nuevo proyecto de aplicación web del tipo ASP.NET MVC 3 y denomínelo MEFMVCApp.

  2. En el cuadro de diálogo Nuevo proyecto de ASP.NET MVC 3, elija Aplicación de Internet.

  3. Cree una carpeta denominada Parts en el proyecto. Los elementos son la unidad básica de composición de MEF y se pueden usar para proporcionar todos los servicios que no ofrece la aplicación de MVC: acceso a datos, cálculos, tener acceso a otros sitios o servicios e implementar la lógica empresarial.

Exportar e importar partes

En aplicaciones ASP.NET MVC, se usan interfaces para definir el contrato que una parte proporciona a otras partes.

Para exportar e importar partes

  1. Abra el menú contextual para la carpeta Parts y agregue una interfaz denominada ILogger.cs. Agregue el código siguiente:

    public interface ILogger
    {
        void Write(string text);
    }
    

    Las clases concretas en la carpeta Parts se supone que son para la composición administrada. En términos de MEF, estas clases se exportarán (vea Información general de MEF). Por convención, las interfaces que una parte implemente se asume que son los contratos que desea exportar.

  2. Abra el menú contextual para la carpeta Parts y agregue una clase denominada TraceLogger.cs. Agregue el código siguiente:

    public class TraceLogger : ILogger
    {
        public void Write(string text)
        {
            System.Diagnostics.Trace.WriteLine(text);
        }
    }
    

    Esta parte se exportará bajo el tipo de contrato ILogger. Para usar esta parte de la aplicación MVC, puede importarla en el controlador.

  3. Abra HomeController.cs en la carpeta de los controladores. Agregue una instrucción using para el espacio de nombres MEFMVCApp.Parts. Agregue el miembro y los constructores siguientes:

        ILogger _logger;
    
         public HomeController() : this(new TraceLogger())
          {
          }
    
        public HomeController(ILogger logger)
        {
            _logger = logger;
        }
    
  4. Agregue la línea siguiente al cuerpo del método Index() para mostrar TraceLogger:

    _logger.Write("MEFMVCApp: Executing the Index() action method.");
    
    

    Compile y ejecute el proyecto. Cuando se muestra la página de índice, el mensaje registrado aparece en la ventana de seguimiento.

Cambiar el comportamiento predeterminado

El motor de composición de MVC hace suposiciones sobre qué se debe hacer con los elementos basados en convenciones. Puede invalidar estos comportamientos predeterminados agregando los atributos MEF adecuados a las partes.

Para invalidar el comportamiento predeterminado

  1. En TraceLogger.cs, agregue una instrucción using para System.ComponentModel.Composition y, después, agregue el atributo siguiente a la clase:

    [Export("myTraceLogger", typeof(ILogger))]
    

    HomeController no podrá importar TraceLogger, porque sus nombres de contrato ya no coinciden.

  2. Para agregar un nombre de contrato a la importación, en HomeController.cs, agregue una instrucción using a System.ComponentModel.Composition y, a continuación, cambie el constructor de la clase al siguiente:

            public HomeController([Import("myTraceLogger")]ILogger logger)
            {
                _logger = logger;
            }
    

    La importación y la exportación ahora vuelven a coincidir. Para obtener más información sobre los atributos MEF, vea Información general del modelo de programación con atributos.

Ámbito de aplicación y solicitud

Las instancias de los elementos creados en una aplicación MVC existen en uno de estos dos ámbitos: el ámbito de la solicitud o el ámbito de aplicación. De forma predeterminada, las instancias del elemento que se crean durante una solicitud web están en un ámbito de la solicitud. Las instancias de los elementos que están en la misma solicitud se comparten, por lo que si más de un elemento importa un elemento determinado, todos los importadores reciben una referencia a la misma instancia. Cada solicitud web tiene su propio ámbito, por lo que las partes creadas en una solicitud nunca se usan para rellenar las importaciones en otra solicitud.

Cuando finaliza una solicitud, el ámbito asociado y cualquier parte creada para él se destruye. Se desechan los elementos que implementan un objeto IDisposable. Esto garantiza que se cierran correctamente los recursos confidenciales, como las conexiones de bases de datos.

A veces, puede que no desee crear una instancia de elemento para cada solicitud (por ejemplo, cuando implementa una caché de aplicación). En estos casos, puede forzar la creación de una parte en el ámbito de aplicación aplicando el atributo SharedAttribute. Los elementos del ámbito de la aplicación los comparten siempre todas las solicitudes de la aplicación. Una parte del ámbito de aplicación puede depender de otra parte del ámbito de aplicación solo para las importaciones. Los elementos del ámbito de la aplicación deben tener cuidado con la protección de los subprocesos.

Puede invalidar estos valores predeterminados para compartir mediante atributos MEF, de la misma manera que se usaron los atributos de importación y exportación en la sección anterior. Para obtener más información sobre los atributos MEF, vea Información general del modelo de programación con atributos.

Atributos de filtro de acción

Puede aplicar atributos de filtro de acción a los controladores y las acciones para cambiar la forma en que se ejecutan las acciones. Aunque los atributos de filtro de acción no los ha creado el proveedor de composición, pueden suministrarse con partes usando el atributo Import.

Para proporcionar un filtro de acción

  • Use el atributo Import, como en este ejemplo:
public class SaveChangesAttribute : ActionFilterAttribute
{
    [Import]
    public IDbContext DbContext { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception == null)
            DbContext.SaveChanges();
    }
}

Vea también

Conceptos

Managed Extensibility Framework (MEF)

Información general del modelo de programación con atributos

Otros recursos

Models and Validation in ASP.NET MVC