2013-06-18 20 views
2

我有我想通過以下URI來暴露ASP.Net網頁API控制器設計指南

  1. HTTP多種資源:///國家GET
  2. 的http:///狀態COUNTRYCODE = ** GET
  3. 的http:///人GET,POST,PUT,DELETE

我使用Asp.Net的Web API構建RESTful服務來訪問這些資源。

創建這些控制器的最佳做法是什麼?我應該爲每個資源創建單獨的控制器嗎?或者有一些方法可以將這些網址映射到單個控制器的操作?

單控制器類將幫助如果我使用DependencyResolver,因爲我看到DependencyResolver可以返回單個控制器的實例。 (我可能在這裏是錯的)

我需要依賴解析器,因爲我的控制器類將通過構造函數注入具有一些儲存庫對象。

我不會使用任何IoC,只有窮人的DI。

一個加法

我已經成功地設計用於在REST WCF網絡API這個問題,但不是在Asp.Net的Web API。我是新來的。

回答

3

爲每個資源創建一個單獨的控制器。

因爲你有DI問題,毀了你的API是一個壞主意。

免費Apigee Web API Design ebook非常短,非常好,當然值得一讀。

+1

謝謝尼爾......但沒有得到你的評論「因爲你有DI問題,毀了你的API是一個壞主意。」如果我使用單獨的控制器,那麼如何使用依賴解析器解析構造函數依賴項? – Bijit

+0

嗨Bijit。也許我誤解了你的意思,但是這聽起來像是你考慮爲國家,國家和人員制定單一控制器的主要原因是你在自動注入依賴到多個控制器時遇到了一些麻煩。如果是這種情況,你可能想發佈一個單獨的問題;如果不是,我的不好。 –

+0

你說得對尼爾。任何方式我使用IHttpControllerActivator而不是IDependencyResolver來組合控制器來解決問題。 – Bijit

0

正如尼爾上面提到的,最好的做法是創建3個不同的控制器:如果從ApiController獲得他們

  • CountriesController
  • StatesController
  • PersonsController

,他們會可以在以下網址自動獲得:

  • /API /國家
  • /API /狀態
  • /API /人

如果從控制器獲得,他們將在以下網址提供:

  • /國家
  • /states
  • /persons

至於依賴注入,你可以從你自己的BaseController派生出來,並注入所有的依賴關係,如果這是你絕對需要的。或者每個班級可能需要不同的界面,並讓你的DI解決這個問題。

希望它有幫助!

0

在Web API中,可以將多個不同的URL映射到單個控制器的操作。下面是它如何可以做到:

在App_Start文件夾下WebApiConfig.cs,默認映射就會自動創建爲:

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

要映射的操作方法,以及在routeTemplate中添加{action}參數上述路線如下:

  routeTemplate: "api/{controller}/{action}/{id}", 

現在您可以創建一個具有不同操作方法的控制器來匹配您的請求。該控制器的操作是這樣的:

// Reached by /api/controllername/getcountries 
    public IEnumerable<string> GetCountries() 
    { 
     // Custom code 
    } 


    // Reached by /api/controllername/getstates/countrycode 
    public IEnumerable<string> GetStates(string id) 
    { 
     // id contains the countrycode string 
    } 

確保操作方法的名稱仍與HTTP動詞開頭:Get | Put | Post | Delete,但!