MEF and ASP.NET MVC
        Posted  
        
            by denis_n
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by denis_n
        
        
        
        Published on 2010-06-13T20:02:07Z
        Indexed on 
            2010/06/13
            20:12 UTC
        
        
        Read the original article
        Hit count: 384
        
I want to use MEF with asp.net mvc. I wrote following controller factory:
public class MefControllerFactory : DefaultControllerFactory
{
    private CompositionContainer _Container;
    public MefControllerFactory(Assembly assembly)
    {
        _Container = new CompositionContainer(new AssemblyCatalog(assembly));
    }
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType != null)
        {
            var controllers = _Container.GetExports<IController>();
            var controllerExport = controllers.Where(x => x.Value.GetType() == controllerType).FirstOrDefault();
            if (controllerExport == null)
            {
                return base.GetControllerInstance(requestContext, controllerType);
            }
            return controllerExport.Value;
        }
        else
        {
            throw new HttpException((Int32)HttpStatusCode.NotFound,
                String.Format(
                    "The controller for path '{0}' could not be found or it does not implement IController.",
                    requestContext.HttpContext.Request.Path
                )
            );
        }
    }
}
In Global.asax.cs I'm setting my controller factory:
protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
        ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory.MefControllerFactory(Assembly.GetExecutingAssembly()));
    }
I have an area:
[Export(typeof(IController))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller
{
    private readonly IArticleService _articleService;
    [ImportingConstructor]
    public HomeController(IArticleService articleService)
    {
        _articleService = articleService;
    }
    //
    // GET: /Articles/Home/
    public ActionResult Index()
    {
        Article article = _articleService.GetById(55);
        return View(article);
    }
}
IArticleService is an interface.
There is a class which implements IArticleService and Exports it.
It works.
Is this everything what I need for working with MEF?
How can I skip setting PartCreationPolicy and ImportingConstructor for controller?
I want to set my dependencies using constructor.
When PartCreationPolicy is missing, I get following exception:
A single instance of controller 'MvcApplication4.Areas.Articles.Controllers.HomeController' cannot be used to handle multiple requests. If a custom controller factory is in use, make sure that it creates a new instance of the controller for each request.
© Stack Overflow or respective owner