MVC5的MEF插件

时间:2014-05-02 23:16:40

标签: asp.net-mvc asp.net-mvc-5 mef

我正在使用MEF创建一个支持插件的MVC 5应用程序。使用来自MEF的IControllerFactory和IOC我已经使它工作,以便/app/specialcontroller/action从另一个dll(插件)调用动作和控制器。

我遇到的问题是,当加载bundlescontent时,控制器工厂失败,因为contentbundles未从插件中导出。

我希望将默认工厂用于某些“控制器”名称。

这可能吗?

这是我基于它的答案...... MEF with MVC 4 or 5 - Pluggable Architecture (2014)

包括app/bundles/jquery时,我希望它使用bundles

的MVC控制器

希望有道理,谢谢

1 个答案:

答案 0 :(得分:0)

在这种情况下,我之前在我的一个项目中使用了以下控制器工厂 -

namespace CaterPiller.WebClient.Factories
{
    public class MvcControllerFactory : DefaultControllerFactory
    {
        private readonly CompositionContainer _container;
        public MvcControllerFactory(CompositionContainer container)
        {
            _container = container;
        }

        protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
        {
            if(controllerType == null)
            {
                return null;
            }
            var export = _container.GetExports(controllerType, null, null).FirstOrDefault();
            return null == export
                       ? base.GetControllerInstance(requestContext, controllerType)
                       : (IController) export.Value;
        }

        public override void ReleaseController(IController controller)
        {
            ((IDisposable) controller).Dispose();
        }
    }
}

对于bundlescontent,控制器类型通常是null,所以我只是为它们返回了null -

if(controllerType == null)
                {
                    return null;
                }

并让它们由默认控制器提供服务。我的其他网址仅由控制器bundlescontents提供,所以这对我有用。可能不是最好的解决方案但是当我使用MEF创建控制器工厂时,这解决了我的问题。您可以尝试此解决方案,这可能对您有所帮助。