【发布时间】:2011-09-27 11:05:46
【问题描述】:
目前我有一个相当复杂的项目,作为其中的一部分,我有一个 MEF 层,它纯粹处理插件的加载,然后新加载的插件公开它们在 asp.mvc 中注册的路由和它们的控制器被添加到 Ninject 的绑定中。
然而,当动态添加的路由被命中(并且它们被命中,我已经用路由调试器检查过)时,即使为路由中的插件正确添加了命名空间,问题也会出现。当我说我添加了命名空间时,我的意思如下:
var namespaces = new [] { "MyPlugin.Controllers" };
routeCollection.MapRoute(
PluginRoute, "plugin/{action}",
new { controller = "Plugin", action = "Default" },
namespaces);
只是为了给这种情况更多的背景,我从 NinjectHttpApplication 继承而不做任何其他事情,没有自定义控制器工厂,没有自定义依赖解析器,这正是 Ninject 给我的。然后我将当前活动的内核交给插件,它们自己注册。
现在被命中的路由不起作用,我只会为任何外部路由得到 404,即使它们被命中并且控制器(是的三重检查)已向 Ninject 内核注册。所以我在想,虽然 Ninject 已经注册了类型,但是 Mvc 的 DefaultControllerFactory 在调用时找不到类型:
GetControllerTypeWithinNamespaces(string controllerName, HashSet<string> namespaces)
目前让我感到困惑的一件事是,即使使用正确的命名空间也找不到它......但是只是为了证明我的假设,如果我在 asp mvc 项目中添加插件作为引用并运行它(不更改任何代码,只是插件程序集是项目中的引用,因此它将最终在 bin 目录中)它将起作用。击中路线,我得到所需的输出......
所以此时我想知道,虽然 MEF 托管了外部 DLL,但它并没有以某种方式与当前的 AppDomain 或其他东西共享它……这似乎很奇怪……
目前这对我来说是一个障碍,所以任何建议都会很棒!
【问题讨论】:
-
您可以尝试使用依赖解析器吗?
-
当这些插件全部崩溃时,它们在哪里?您是否尝试将它们复制到您正在运行的项目的
bin文件夹中? -
我不得不硬着头皮写一些代码来观察插件文件夹,每当有变化时将其移动到 bin 目录中。我很想实现另一种解决方案,但我认为不存在,除了获取程序集并将它们手动加载到 AppDomain 中,但是如果不卸载整个 AppDomain 就无法从那里删除它们,并且如果您开始获得多个他们,一切都会变得一团糟……
-
您能否提供示例应用程序来演示该问题?要么把它上传到某个地方,要么给我发一封邮件,然后我会看看。
-
抱歉,Remo 回复晚了,我会尝试复制我当前应用程序的核心方面给你看,看看你是否能看到问题出在哪里,虽然我超级好,但可能几天后此刻很忙。感谢您的回复
标签: asp.net-mvc ninject