9

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

我想知道,这是否可行。

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

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

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

任何帮助将不胜感激!

马吕斯

4

5 回答 5

2

感谢您的回答。

我想通了,这是不可能的,因为所有的控制器都被加载一次并且一直被缓存。

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

为了进行类型缓存刷新,我必须实现一个自定义 HttpControllerSelector。

于 2012-11-27T13:50:38.153 回答
2

您可以使用 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 依赖解析器

于 2012-11-27T08:59:03.147 回答
2

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

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

于 2012-11-27T19:32:02.750 回答
0

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

于 2012-11-27T08:51:31.327 回答
0

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

void RegisterControllers(RouteCollection 路由);

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

于 2012-11-27T14:11:15.107 回答