2015-06-28 73 views
1

我正在爲一個應用程序構建一個WebAPI服務,並且我被困在一個交叉路口,我理解了SOLID原則並希望按照這些原則實現我的WebAPI服務,但是我花了最後幾天在執行中掙扎,並希望得到社區的一些建議。單一責任原則webapi

,每類應該有過的由軟件提供的功能單一的一部分責任單一職責原則規定(見Solid Principles

我目前有兩個ApiControllers但會有更多的,而且這兩個目前都有Get,Post和Put功能,但是每個控制器也需要一個Search函數,我的問題是如果搜索方法被移入一個單獨的ApiController,例如SearchController。

例如:

我有一個用戶控制器

public class UserController : ApiController { 
    Get - returns a User 
    Post and Put - Add and update a User 
} 

和我有沿着相同的路線的患者控制器如上,我應該具有在每個控制器我的搜索方法應我有一個SearchController,例如。

public class SearchController : ApiController { 
    SearchUsers() - returns ICollection<User> 
    SearchPatients() - returns ICollection<Patient> 
} 

我知道有沒有明確的答案,並會就像上最好的做法有些意見

+1

「搜索」可能只是一個過濾器的GET,對吧? – Padraic

回答

1

我會介紹搜索作爲各自的控制器上的動作,如果你想跟蹤擁有所有控制器搜索行動,把它放在一個接口。

public interface ISearchable 
{ 
    IHttpActionResult Search(string q); 
} 

public class UsersController : ApiController, ISearchable 
{ 
    [Route("api/Users/Search")] 
    [HttpGet] 
    public IHttpActionResult Search([FromUri] string q) 
    { 
     var userRepo = new UserRepo(); 

     //this search method can be as complex as needed 
     //search initials, middle names, phone numbers, whatever you need. 
     var results = userRepo.Search(q); 

     return this.Ok(results); 
    } 
} 

用法:

https://domain.com/api/Users/Search?q=smith 

這使得它給你的客戶很清楚,因爲他們沒有了解具體SearchController,將基本上是一堆的RPC的。如果你考慮搜索是什麼,它基本上是一個不是標準的http動詞的動詞,所以我們把它作爲一個動作附加到路線上。對於集合,我們仍然按照與GET或POST類似的Users集合進行操作。由於我們沒有將SEARCH作爲有效的HTTP方法,所以一個動作是最好的。

參照SOLID。這使您的控制器成爲簡單的控制器。工作(IMO)是控制請求並將其轉換爲邏輯。在這種情況下,它將路由映射到UserRepo並執行搜索方法。搜索不是控制器的工作,你有另一個課程負責繁重工作。控制器只是簡單地處理根據請求執行的邏輯。即使返回的數據通過串行器延遲到流水線後期,SOLID也應該在控制器上保持真實。

+0

鑑於您顯示的使用情況網址實際上使用的是查詢字符串,參數屬性是否應該不是'[QueryString]'? –

+1

@ ScottK.Fraley [FromUri]按預期工作,並在許多WebApi項目中使用它。我從來沒有嘗試[QueryString],所以我必須給它一個鏡頭。感謝您指點我一些新的嘗試。 – ManOVision

+0

好吧,我會......我總是假設'[FromUri]'表示它(任何給定的參數)必須是Url的一部分,例如, 'api/bla/Param1Value'並且不適用於查詢字符串。謝謝你教我一些我不知道的東西! (但當然應該試過!) –

0

如果你對SRP精神失常並且沒有找到合適的責任水平,那麼最終你會得到一個無所事事的類。

我將用戶控制器視爲負責在用戶資源api和應用程序內部如何實現該概念之​​間進行調解。在這種情況下,在單個控制器中進行所有api操作是有意義的。

這就是說我們遵循命令/查詢分離,因此我們的控制器委託給命令或查詢來完成實際的工作。這樣我們的控制器應該改變的唯一原因就是我們想要改變我們提供的API。

+0

不過,我認爲每個命令/查詢都被注入到ApiController中。這意味着每個動作可能至少使用一個動作,但可能不會使用其他動作。這導致了一個webapi控制器,它只依賴於其中的少數幾個被使用。在這種情況下,我更喜歡每種方法使用一個類,並確保將它們放在一個清晰的文件夾結構中,以防止東西變成一團糟。 – Robba