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
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.