Saltar al contenido

Cómo integrar MEF con ASP.NET MVC 4 y ASP.NET Web API

Nuestro grupo redactor ha pasado horas investigando la resolución a tus interrogantes, te ofrecemos la solución y nuestro deseo es servirte de gran apoyo.

Solución:

La solución es implementar System.Web.Mvc.IDependencyResolver y System.Web.Http.Dependencies.IDependencyResolver y registrar su implementación con ASP.NET MVC y ASP.NET Web API respectivamente, en su Application_Start método.

En este ejemplo crearemos una clase MefConfig, que implementa un método RegisterMef que se llama desde Application_Start para instalar nuestro solucionador de dependencias. La clase MefDependencyResolver implementa ambos System.Web.Mvc.IDependencyResolver y System.Web.Http.Dependencies.IDependencyResolver y, como tal, maneja las tareas de resolución de dependencias tanto para MVC como para Web API.

Application_Start, ponga esto en su Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        [...]
        MefConfig.RegisterMef();
    

MefDependencyResolver y MefConfig:

/// 
/// Resolve dependencies for MVC / Web API using MEF.
/// 
public class MefDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver, System.Web.Mvc.IDependencyResolver

    private readonly CompositionContainer _container;

    public MefDependencyResolver(CompositionContainer container)
    
        _container = container;
    

    public IDependencyScope BeginScope()
    
        return this;
    

    /// 
    /// Called to request a service implementation.
    /// 
    /// Here we call upon MEF to instantiate implementations of dependencies.
    /// 
    /// Type of service requested.
    /// Service implementation or null.
    public object GetService(Type serviceType)
    
        if (serviceType == null)
            throw new ArgumentNullException("serviceType");

        var name = AttributedModelServices.GetContractName(serviceType);
        var export = _container.GetExportedValueOrDefault(name);
        return export;
    

    /// 
    /// Called to request service implementations.
    /// 
    /// Here we call upon MEF to instantiate implementations of dependencies.
    /// 
    /// Type of service requested.
    /// Service implementations.
    public IEnumerable GetServices(Type serviceType)
    
        if (serviceType == null)
            throw new ArgumentNullException("serviceType");

        var exports = _container.GetExportedValues(AttributedModelServices.GetContractName(serviceType));
        return exports;
    

    public void Dispose()
    
    


public static class MefConfig

    public static void RegisterMef()
    
        var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        var container = new CompositionContainer(asmCatalog);
        var resolver = new MefDependencyResolver(container);
        // Install MEF dependency resolver for MVC
        DependencyResolver.SetResolver(resolver);
        // Install MEF dependency resolver for Web API
        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = resolver;
    


La respuesta de @ aknuds1 es la mejor que he visto hasta ahora para integrar MEF en DependencyResolver. Pude extenderlo para usar la composición basada en convenciones en MEF2 con bastante facilidad. La clase MefConfig es todo lo que se necesita para cambiar y luego no mucho.

/// 
///     Responsible for configuring MEF for the application.
/// 
public static class MefConfig

    /// 
    ///     Registers MEF conventions and exports.
    /// 
    public static void RegisterMef()
    
        // Register MVC/API conventions
        var registrationBuilder = new RegistrationBuilder();
        registrationBuilder.ForTypesDerivedFrom().SetCreationPolicy(CreationPolicy.NonShared).Export();
        registrationBuilder.ForTypesDerivedFrom().SetCreationPolicy(CreationPolicy.NonShared).Export();
        var assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly(), registrationBuilder);
        var aggregateCatalog = new AggregateCatalog(assemblyCatalog);
        var container = new CompositionContainer(aggregateCatalog);
        var resolver = new MefDependencyResolver(container);
        // Install MEF dependency resolver for MVC
        DependencyResolver.SetResolver(resolver);
        // Install MEF dependency resolver for Web API
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    

Comentarios y puntuaciones del tutorial

Eres capaz de añadir valor a nuestra información colaborando tu veteranía en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología