我已经将预编译的视图和控制器内置到独立的DLL中.我可以动态加载DLL并从我的核心项目中检查,甚至调用它们的方法;然而,似乎MVC框架不知道控制器.我在这附近,但有些东西丢了.
控制器和视图背景
控制器内置在独立的MVC项目中,并由Controller继承.没有什么太有趣的那里.这些意见使用RazorGenerator并成为项目中的类.
项目的输出是一个正确包含控制器和视图的DLL.
DLL实现一个特定的接口,我们将它称为IPlugin,在一个单独的类(不是控制器的一部分)在库中.
加载DLL
在Visual Studio中作为管理员运行我编译我的应用程序,它是托管在IIS下.随着项目的建立,我将一个插件DLL放入我的“插件”目录.没有调试(这将变得很重要),我打开IE并导航到该网站.请注意,此时应用程序已经构建,但从未运行,因此启动事件将触发.如果我回收应用程序池,这里的所有内容仍然是一致的.
我有一个启动类有两个方法,PreStart和PostStart,并分别使用WebActivator.PreApplicationStartMethod和WebActivator.PostApplicationStartMethod调用方法.
PreStart是我执行以下操作的地方:
>获取我的“插件”目录中的所有插件DLL的列表
>将所有插件复制到AppDomain.CurrentDomain.DynamicDirectory
>加载类型…如果它包含一个IP插件我然后
>将程序集添加到BuildManager
>调用实现IPlugin的类中的一些方法
在’PostStart’中,我做这个代码(基于RazorGenerator.Mvc的代码):
foreach (var assembly in Modules.Select(m=>m.Value)) { var engine = new PrecompiledMvcEngine(assembly) { UsePhysicalViewsIfNewer = HttpContext.Current.Request.IsLocal }; ViewEngines.Engines.Insert(0,engine); VirtualPathFactoryManager.RegisterVirtualPathFactory(engine); }
此上下文中的模块是键/值对,其中值是加载的程序集.此代码的目的是确保MVC通过为知道如何解析视图(这是RazorGenerator的一部分)的每个程序集添加视图引擎来了解视图.
我怎么知道我很近(但显然没有雪茄)
IPlugin定义了一种名为RegisterRoutes的方法,您猜测它将为实现该接口的用户注册路由.我在PreStart中调用此方法,并添加路由 – 我已经验证了这些存在于我的路由表中.例如,在我的插件中定义的路线上,通过在PreStart中动态调用该方法创建,在检查我的路由时,我会看到像这样的DataToken:
Namespaces = Plugin.Name.Controllers
所以,路由被注册,程序集被加载,我已经验证了DLL被正确复制到AppDomain的DynamicDirectory.我可以调用在运行时动态加载的类的成员.但是当我导航到路由匹配的URL时,我得到一个404.这不是一个“找不到视图”的YSOD,更类似于没有找到控制器.
这是混淆我的部分:如果在这一点上,没有任何事情,我回到Visual Studio,并点击F5 …一切正常.
就像Visual Studio以某种方式意识到控制器,我无法识别,而且MVC框架正在上升.
最后一个问题
我缺少什么,如何让MVC框架知道我的控制器?
嘿,在这一点上,如果你还在读这个,谢谢. 原文链接:https://www.f2er.com/aspnet/249582.html