2012-11-03 36 views
0

我正在一個MVC 4項目中使用webapi,EF5,Windsor Castle以及我有一個問題......我應該返回實體(或DTO)在Get方法或者我應該返回一個HttpResponseMessage?什麼是更好的方法和更標準的方法來做到這一點?WebApi控制器在實體框架5和MVC 4項目中返回值

那麼,這是嗎?

[System.Web.Http.HttpGet] 
public HttpResponseMessage GetById(long id) 
{ 
    var branch = Uow.Branches.GetById(id); 
    if (branch != null) 
    { 
     Request.CreateResponse(HttpStatusCode.OK, branch); 
    } 

    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
} 

或者這個?

[System.Web.Http.HttpGet] 
public Branch GetById(long id) 
{ 
    var branch = Uow.Branches.GetById(id); 
    if (branch != null) return branch ; 
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound)); 
} 

回答

3

我將返回DTO包裹在HttpResponseMessage如下:

return this.Request.CreateResponse(HttpStatusCode.OK, branch); 

DTO /視圖模型將使只發送所需的屬性。

HttpResponseMessage允許發送額外的狀態碼,例如在輸入無效的情況下,我們可以發送statusCode預條件失敗。

if (model.EventDate == null) 
      { 
       var responseMessage = new HttpResponseMessage(); 
       responseMessage.StatusCode = HttpStatusCode.PreconditionFailed; 
       responseMessage.ReasonPhrase = "Please enter valid EventDate input"; 
       return responseMessage; 

      } 
1

取決於。但是,在您的示例中,由於Get操作的兩個版本產生相同的響應,我將返回實體Branch而不是HttpResponseMessage。這是因爲該框架將有助於抽象出HttpResponseMessage的實際創建,因此該操作更關注業務邏輯。

如果您需要對響應消息進行更多控制(即設置不同的狀態碼),那麼我將返回HttpResponseMessage。

希望這會有所幫助。