我正在开发一个基于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使用它? 这个问题有一个已知的解决方法吗?