2012-11-27 79 views
9

在我的Asp.Net MVC 4 WebApi應用程序中我希望稍後(在WebApi初始化後)動態加載其他WebApiControllers,它們位於單獨的程序集中。此外,我想在運行時爲這些控制器添加路由。ASP.Net WebApi:如何在運行時加載額外的控制器

我很好奇,如果這是可以做到的。

我的目標是構建一個web應用程序,我可以上傳控制器(編譯後的程序集),控制器將自動託管在此應用程序中。

我已經試圖通過實現我自己的AssemblyResolver類來實現該目標,但是(據我所見),AssemblyResolver在初始化階段加載一次。

可能有「重新加載」所有控制器的選項。

任何幫助將不勝感激!

馬呂斯

+0

http://www.dotnetcurry.com/ShowArticle.aspx?ID=898你見過這個。 –

+0

我的一位前同事在我們的系統中得到了與這種工作幾乎相同的東西。我知道他最終使用[MEF](http://msdn.microsoft.com/zh-cn/library/dd460648.aspx)來管理動態程序集加載,但我不記得具體細節。我給他發了這篇文章的鏈接,也許他會回覆你。與此同時,您可以嘗試使用MEF自行提供解決方案。 – gzak

回答

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

2

謝謝您的回答。

我想通了,這是不可能的,因爲所有的控制器都加載一次,並在整個過程中被緩存。

請參閱DefaultHttpControllerSelector方法InitializeControllerInfoCache(...)中的HttpControllerTypeCache。

爲了做類型緩存刷新,我必須實現一個自定義的HttpControllerSelector。

0

那麼如果在Global.asax中您加載特定文件夾中的所有組件,然後尋找實現特定接口的類,例如

無效RegisterControllers(RouteCollection路線);

創建一個實例,然後傳入您的路由集合。然後這將在網站啓動過程中註冊其他路線。

+0

嗨,彼得,我想稍後動態加載其他WebAPi控制器(當網站已經運行時)。我知道如何在global.asax中加載控制器,但這只是一次 - 在啓動時。 – Marius

+0

當您更改二進制文件夾的內容時,IIS是否不會重新啓動Web應用程序? –

相關問題