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

时间:2012-11-27 08:39:47

标签: c# asp.net-mvc asp.net-web-api

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

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

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

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

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

任何帮助将不胜感激!

的Marius

5 个答案:

答案 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);

        // ...
    }
}

Using the Web API Dependency Resolver

答案 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);

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