在我的Asp.Net MVC 4 WebApi应用程序中,我希望稍后(在WebApi初始化之后)动态加载其他WebApiControllers,它们位于不同的程序集中。此外,我想在运行时为这些控制器添加路由。
我很奇怪,如果可以的话。
我的目标是构建一个Web应用程序,我可以在其中上传控制器(已编译的程序集),控制器将自动托管在此应用程序中。
我已经尝试通过实现我自己的AssemblyResolver类来实现它,但是(据我所见),AssemblyResolver在初始化阶段加载一次。
可能有“重新加载”所有控制器的选项。
任何帮助将不胜感激!
的Marius
答案 0 :(得分:2)
您可以使用Web API依赖性解析器:
public class WebApiApplication : System.Web.HttpApplication
{
void ConfigureApi(HttpConfiguration config)
{
config.DependencyResolver = new MyDependencyResolver();
}
protected void Application_Start()
{
ConfigureApi(GlobalConfiguration.Configuration);
// ...
}
}
答案 1 :(得分:2)
感谢您的回答。
我弄明白了,不可能这样做,因为所有控制器都被加载一次并且在整个时间都被缓存。
请参阅DefaultHttpControllerSelector方法InitializeControllerInfoCache(...)中的HttpControllerTypeCache。
为了进行类型缓存刷新,我必须实现一个自定义的HttpControllerSelector。
答案 2 :(得分:2)
MEF是要走的路。您需要创建自己的控制器工厂来替换默认的控制器工厂。请查看此链接 http://www.fidelitydesign.net/?p=104
编辑:死链接,请参阅Wayback https://web.archive.org/web/20130619191423/http://www.fidelitydesign.net/?p=104
答案 3 :(得分:0)
我认为你需要看一下这个http://haacked.com/archive/2010/01/17/editable-routes.aspx作为起点。
答案 4 :(得分:0)
如果在Global.asax中,您将所有程序集加载到特定文件夹中,然后查找实现特定接口的类,例如
void RegisterControllers(RouteCollection routes);
创建一个实例,然后传入您的路径集合。然后,这将在网站启动期间注册其他路线。