2015-06-24 38 views
2

當我看到有關存儲庫模式它當然是一個總簡單的示例無關,與現實世界要求微軟的樣本 - 一如既往... -什麼樣的錯誤代碼應該存儲庫恢復到REST的Web API

http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

存儲庫中添加/刪除/更新方法返回void - 什麼 -

另一方面當有人使用我的REST的Web API,我想提供的東西像

NotFound()如果記錄的刪除沒有做任何

OK()如果刪除成功

同爲Update方法。

你在真實世界的項目中使用什麼作爲存儲庫的返回類型,以便讓調用者知道發生了什麼?

回答

1

主要有兩種選擇:

  1. 款待情況類似NOTFOUND爲例外。指定在您要刪除的對象不存在的情況下將由您的存儲庫拋出的異常類型。如果您選擇此選項,那麼您可以在Web API層擁有一個非常通用的異常捕獲處理程序,該處理程序知道這些異常應該轉換爲什麼類型的響應。
  2. 更改存儲庫接口以返回錯誤值OptionalSum Type,表示對該方法的調用的所有可能結果。這需要調用存儲庫的方法來決定在每個場景中要做什麼,但是它在處理場景時也有更大的靈活性。 (例如,如果人本身不在那裏,也許你想要DeletePerson返回NotFound,但是如果在使用不同的存儲庫清理某些相關數據時沒有數據存在,那麼您希望使用不同的返回類型?)

你應該怎麼做避免是讓Repository層返回某種面向HTTP的響應代碼。

+0

我喜歡你的第一種方法,首先將NotFound視爲例外。因此,我將創建一個NotFoundException類並將其與NotFoundExceptionFilterAttribute連接:-)謝謝! – Elisabeth

+0

@Elisa:在這種情況下,您可能需要考慮的另一件事是提供一種不引發異常的方法 - 也許是一個TryDelete()方法,該方法返回一個布爾值或者根本不會執行任何操作該項目不在那裏。你很可能會遇到你不在乎這件事是否已經被刪除的情況,並且我不建議在這些情況下抓住和吃掉例外。 – StriplingWarrior

+0

順便說一句。在那裏沒有發生異常的情況下你會返回什麼?空虛嗎?對於創建,我必須返回實體 - 因爲新創建的Id - 但對於更新/刪除/附加/分離?最後兩個只是一個關係刪除實際上是一種HTTP補丁。 – Elisabeth

0

你在真實世界的項目中使用什麼作爲存儲庫的返回類型,以便讓調用者知道發生了什麼?

「結果對象」。一個簡單的版本看起來是這樣的:

public class RepositoryActionResult 
{ 
    public int RecordsAffected { get; set; }   
} 

然後你可以設置從倉庫的方法和處理來自適當調用代碼的結果,而不使用異常的控制流。

根據您的要求,您可以根據需要將此課程設置爲複雜。

+0

如果你問我,RecordsAffected在倉庫之外是沒用的。如果每更新一行3個表格,SaveChanges返回3。更新可能仍然是錯誤的。我已經有這樣的方式:int recordsAffected = context.SaveChanges()我不喜歡它計算表...在一個錯誤情況下返回插入實體或null。 – Elisabeth

相關問題