天天看點

打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector

 以Asp.Net Web Api 為例,随着業務的擴充,産品的疊代,我們的web api也在随之變化,很多時候會出現多個版本共存的現象,這個時候我們就需要設計一個支援版本号的web api link,比如:

原先:http://www.test.com/api/{controller}/{id}

如今:http://www.test.com/api/{version}/{controller}/{id}

在我們剛設計的時候,有可能沒有考慮版本的問題,我看到很多的項目都會在link後加入一個“?version=”的方式,這種方式确實能夠解決問題,但對Asp.Net Web Api來說,進入的還是同一個Controller,我們需要在同一個Action中進行判斷版本号,例如:

http://www.test.com/api/bolgs?version=v2[HttpGet]

我們看到我們通過判斷url中的version參數進行對應的傳回,為了確定原先接口的可用,我們需要對參數賦上預設值,雖然能夠解決我們的版本疊代問題,但随着版本的不斷更新,你會發現這個Controller會越來越臃腫,維護越來越困難,因為這種修改已經嚴重違反了OCP(Open-Closed Principle),最好的方式是不修改原先的Controller,而是建立新的Controller,放在對應的目錄中(或者項目中),比如:

打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector
為了不影響原先的項目,我們盡量不要改動原Controller的Namespace,除非你有十足的把握沒有影響,不然請盡量隻是移動到目錄。

ok,為了保持原接口的映射,我們需要在WebApiConfig.Register中注冊支援版本号的Route映射:

打開浏覽器或者postman,輸入原先的api url,你會發現這樣的錯誤:

打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector

那是因為web api 查找Controller的時候,隻會根據ClassName進行查找的,當出現相同ClassName的時候,就會報這個錯誤,這時候我們就需要打造自己的Controller Selector,好在微軟留了一個接口給到我們:IHttpControllerSelector。不過為了相容原先的api(有些不在我們權限範圍内的api,不加版本号的那種),我們還是直接內建DefaultHttpControllerSelector比較好,我們給定一個規則,不負責我們版本疊代的api,就讓它走原先的映射。

1、項目啟動的時候,先把符合條件的Controller加入到一個字典中

2、判斷request,符合規則的,我們傳回我們制定的controller。

打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector
打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector

思路有了,那改造起來也非常簡單,今天我們先做一個簡單的,等有時間改成可配置的。

第一步,我們先建立一個Selector類,繼承自DefaultHttpControllerSelector,然後初始化的時候建立一個屬于我們自己的字典:

有了字典接下來就好辦了,隻需要分析request就好了,符合我們版本要求的,就從我們的字典中查找對應的Descriptor,如果找不到,就走預設的,這裡我們需要重寫SelectController方法:

完成這個類後,我們去WebApiConfig.Register中進行替換操作:

ok,再次打開浏覽器,輸入http://www.xxx.com/api/blogs 和 http://www.xxx.com/api/v2/blogs ,這時應該能看到正确的執行:

打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector
打造屬于自己的支援版本疊代的Asp.Net Web Api Route思路打造屬于自己的Selector

本文轉自 sshpp 51CTO部落格,原文連結:http://blog.51cto.com/12902932/1949432,如需轉載請自行聯系原作者

繼續閱讀