MVC4 MEF插件系统和强类型视图

时间:2015-04-24 19:56:12

标签: model-view-controller plugins view mef strong-typing

我正在开发一个基于MEF的插件系统,其中导出接口IPluginInfo的〜/ WebPlugins /文件夹下的每个dll文件都被视为插件。

public interface IPluginInfo
{
    string Name { get; }
    string Description { get; }
    string AssemblyName { get; }
    string Version { get; }
    PluginType PluginType { get; }
    Guid PluginGuid { get; }
}

除了界面导出外,每个dll都会像这样导出它自己的控制器:

namespace WebSettings.Controllers
{
    [Export("Groups", typeof(ARMController))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    [ArmAuthorize(Roles = "WebSettings")]
    public class GroupsController : ARMController
....

在主项目中,我有一个覆盖的DefaultControllerFactory的CreateController方法,该方法允许在导出的MEF中搜索所需的控制器。

public class ARMControllerFactory : DefaultControllerFactory
    {
        public override IController CreateController(RequestContext requestContext, string controllerName)
        {
            IController controller = null;
            try { controller = base.CreateController(requestContext, controllerName); } catch { }

            if (controller == null) controller = PluginManager.GetInstance<ARMController>(controllerName);
            if (controller == null) throw new Exception("Controller not found!");

            return controller;
        }
    }

此外,还有一个重写的RazorViewEngine视图位置搜索路径。它允许MVC在〜/ WebPlugins / Views /文件夹中搜索视图。

所以,一切似乎都很好,但没有。 控制器视图对使用某些模型类在它们之间传递数据是通常的做法。但是在MEF控制器导出的情况下,MVC找不到模型类,它位于导出控制器的同一个dll中。并且,在cource中,视图编译在该阶段失败,并且MVC返回YSOD,其中它抱怨无法找到模型的命名空间。

第一个想法是出口模型类,但我无法找到如何处理该出口。

如何告诉MVC使用它? 这个问题有一个已知的解决方法吗?

0 个答案:

没有答案