目前我已经有了一个相当复杂的项目,并且作为其中的一部分,我有一个纯粹处理插件加载的MEF层,然后新加载的插件公开其使用asp.mvc及其注册的路线控制器添加到Ninject的绑定。Ninject.Web.Mvc知道动态加载控制器,但ASP.Mvc does not?
然而,即使为路由中的插件正确添加了命名空间,当动态添加的路由被命中(并且它们被命中,我已经检查过路由调试器)时,问题就出现了。当我说我已经添加了命名空间我的意思是像如下:
var namespaces = new [] { "MyPlugin.Controllers" };
routeCollection.MapRoute(
PluginRoute, "plugin/{action}",
new { controller = "Plugin", action = "Default" },
namespaces);
只给多一点背景下这种情况下,我从NinjectHttpApplication继承,而不是做其他事情,没有自定义控制器工厂,没有自定义的依赖解析器,就是Ninject给我的。然后我把当前活动的内核,给它的插件,他们自己注册。
现在被击中的路线不起作用,即使他们被击中并且控制器被注册到Ninject内核,也只是得到了404的任何外部路由。所以我想,虽然Ninject有注册的类型,MVC的DefaultControllerFactory不能调用通过时找到类型:
GetControllerTypeWithinNamespaces(string controllerName, HashSet<string> namespaces)
一件事,令我感到困惑的时刻,虽然,是它不与发现它甚至正确的命名空间......但是,只是为了证明我的假设,如果我在asp mvc项目中添加插件作为参考并运行它(不更改任何代码,只是插件程序集是项目中的参考,所以它最终会在bin目录中)它将工作。命中路线,我得到所需的输出...
所以在这一点上,我想知道,如果虽然MEF托管外部DLL,它不是以某种方式与当前的AppDomain共享它...什么似乎很奇怪......
这是我目前的阻挡者,所以任何建议都会很棒!
你可以尝试使用依赖解析器吗? –
这些插件在全部故障时位于哪里?你有没有试过将它们复制到你正在运行的项目的'bin'文件夹中? – Jeroen
我不得不硬着头皮写一些代码来观察插件文件夹,并且每当有更改将其移入bin目录时。我很想实现另一个解决方案,但我不认为其中一个存在,除了获取程序集并将它们手动加载到AppDomain中,但不能在不卸载整个AppDomain的情况下从中删除它们,并且如果您开始获取多个他们,它会变得混乱... – Grofit