2017-02-12 43 views
0

我在asp.net中做了一些API。它與一個MVC webapp結合在一起。我打算讓webapp使用它自己的API,而不是創建2個做同樣事情的後端。如何在WebApi中對所有的CRUD操作使用一個ViewModel

我很努力地嘗試並保持我的重複代碼的最低限度,當涉及到創建模型以在API中使用「傳入」(Post,Put)和「傳出」(get)操作時。

我有一個叫做Event的類,它包含了很容易序列化爲JSON和一些複雜類型的屬性。我創建了一個名爲EventViewModel的模型(是否適合在API中將其稱爲視圖模型?),並使用一些額外的屬性來使Name不在複雜類型中。

理想情況下,我想重新使用這個模型的一切,但是當涉及到定義[Required]標籤,我的邏輯分解...

我首先想到在每個API的使用[Bind(Include() Exclude()]的動作。這聽起來像一個可行的解決方案?

有什麼其他解決方案有人使用?

謝謝!

回答

1

這裏有一些想法。

因爲我們正在談論兩種不同的數據演示,所以我會使用單獨的控制器來查看(Controller)和api(ApiController)。我不會將控制器用作api,因爲它們都返回不同的類型。 api控制器以不同的方式使用狀態碼。例如。 ApiController.Delete返回狀態碼204無內容,而控制器返回狀態碼200 Ok與視圖。

您可以調用Controller ViewModel和ApiController DTO的模型。無論哪種情況,它們都只是簡單的對象。除了驗證(您可以使用ModelState進行測試)之外,不要在這些對象中放置任何邏輯,也不要使用實體對象。

由於您遇到過的原因,請勿將models/dto用於多種用途。只需使用簡單的對象並只使用一次,保持簡單。在這種情況下,如果你想改變一些你知道它不會破壞你的應用程序的東西。

您可以使用可繼承的基類來保存代碼。這也將爲您提供一次爲不同對象編寫擴展的優勢。

但是,如果你堅持重複使用對象,你可以決定不使用Api中的ModelState.Validate。我認爲在這種情況下[必須]標記被忽略,但我不確定。至於對象,我不會使用JsonIgnore/Xmlignore,而是設置默認值。在這種情況下,這些屬性在序列化時被省略。使用POST和GET的對象很容易。

[DefaultValue(0)] 
    public int Id { get; set; } = 0; 

使用存儲庫。您可以在控制器中調用存儲庫,就像在api控制器中一樣。這是您可以真正保存代碼的地方。

對於Api的(不是CRUD)我更喜歡編寫返回匿名對象並將其選擇到dto的專用linq查詢。這提供了多重優勢。有時我使用擴展(在IQueryable上)來保存代碼。

你可能想要考慮使用類似automapper的東西來保存代碼,但我不會推薦這個。

+0

不是我想聽到的,而是一個很好的答案。我想我可能必須爲不同的服務製作多個模型/控制器。謝謝。我正在使用Automapper。我很好奇你爲什麼不會推薦它。到目前爲止,我正在享受美好時光。 –

+0

實際上,我從來沒有使用過automapper,但在我看來,它增加了應用程序的複雜性。 –