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路由);
创建一个实例,然后传入您的路由集合。 然后,这将在网站启动期间注册其他路由。