ASP.Net WebApi:如何在运行时加载其他控制器

在我的Asp.Net MVC 4 WebApi应用程序中,我希望稍后(在WebApi初始化之后)动态加载其他WebApiControllers,它们位于不同的程序集中。 此外,我想在运行时为这些控制器添加路由。

我很奇怪,如果可以的话。

我的目标是构建一个Web应用程序,我可以在其中上传控制器(已编译的程序集),控制器将自动托管在此应用程序中。

我已经尝试通过实现我自己的AssemblyResolver类来实现它,但是(据我所见),AssemblyResolver在初始化阶段加载一次。

可能有一个“重新加载”所有控制器的选项。

任何帮助将不胜感激!

马吕斯

您可以使用Web API依赖性解析器:

public class WebApiApplication : System.Web.HttpApplication { void ConfigureApi(HttpConfiguration config) { config.DependencyResolver = new MyDependencyResolver(); } protected void Application_Start() { ConfigureApi(GlobalConfiguration.Configuration); // ... } } 

使用Web API依赖性解析程序

谢谢你的回答。

我想通了,不可能这样做,因为所有控制器都被加载一次并且在整个时间都被缓存。

请参阅DefaultHttpControllerSelector方法InitializeControllerInfoCache(…)中的HttpControllerTypeCache。

在oder中进行类型缓存刷新,我必须实现一个自定义的HttpControllerSelector。

MEF是要走的路。 您需要创建自己的控制器工厂来替换默认的控制器工厂。 请看这个链接http://www.fidelitydesign.net/?p=104

编辑:死链接,请参阅Wayback https://web.archive.org/web/20130619191423/http://www.fidelitydesign.net/?p=104

我想你需要看一下这个http://haacked.com/archive/2010/01/17/editable-routes.aspx作为起点。

如果在Global.asax中,您将所有程序集加载到特定文件夹中,然后查找实现特定接口的类,例如

void RegisterControllers(RouteCollection路由);

创建一个实例,然后传入您的路由集合。 然后,这将在网站启动期间注册其他路由。