1

鑑於MVC3應用程序使用ViewModel模式和使用實體框架的存儲庫模式。用多個實體保存視圖的MVC3最佳實踐

如果我有一個由多個實體組成的創建和更新視圖,保存數據的最佳做法是什麼?

我應該使用抽象服務層保存日期,該層將保存每個實體的數據與其各自的存儲庫,還是應該使用存儲過程將數據保存到存儲庫中?

我接受任何建議或建議。

在此先感謝!

+0

這實際上取決於實體是如何相關的。一個實體的價值取決於另一個實體的價值嗎?這些實體是否真的只是一個大實體分裂成更小的可管理位? – Garvin 2012-04-25 23:21:39

+0

@Garvin其實只是一個擁有熱切相關實體的大實體。例如,我會急於加載一個小部件的細節,然後必須編輯其中一個細節。由於在檢索數據後我的上下文被丟棄,我相信我必須附加每個相關的實體,然後保存。我必須在主對象的回購的Save方法中這樣做,所以保存所有相關的對象有點誤導。思考? – Rich 2012-04-26 01:16:13

回答

1

這是DDD/CQRS方法最有意義的情況之一。簡而言之,您有一些模擬特定行爲(聚合)的業務對象。存在一個名爲Aggregate Root(AR)的對象,它具有明確的邊界。當你想保存它時,你將整個AR發送到存儲庫,然後將所有內容保存爲一個事務。

工作流

用戶經由視圖模型發送數據。控制器然後將從存儲庫檢索AR或創建它是否是新的。輸入數據通常通過AR方法映射到AR。如果AR發現數據或其結果違反了一些業務規則,則應該拋出一個異常(我們假設基本驗證已經由asp.net mvc自動執行)。

如果一切正常,控制器會將AR發送到回購站,然後它將繼續將AR映射到EF實體,然後將其保存在交易中。

這是簡而言之,我該怎麼做。當然,我實際上實現它有點不同,但概念是相同的。最重要的部分是將所有數據發送給AR,它將知道如何處理關係。

要點

請注意,我所提到的EF後,才AR到了回購。這意味着,AR與EF實體沒有任何關係是完全分離的並且服務於實際的商業模式。只有在模型更新後,我們才關心EF和ONLY內的回購(因爲EF是回購的實施細節)。回購僅將AR數據轉移(基本上映射)到相關的EF實體,然後保存實體。

業務(域)模型和持久模式(EF實體)之間有非常明確的區別很重要。不要使用EF來處理業務規則,只能使用它來盯住/從數據庫檢索數據。 EF僅用於抽象RDBMS訪問,將其用作虛擬OOP數據庫。

你已經提到了ViewModel模式。我還沒有聽說過這種模式,每次使用MVC時,您都已經使用ViewModels。再一次,訣竅是不使用EF實體作爲ViewModels。使用適合視圖的「啞」視圖模型。通過專門的查詢存儲庫填充虛擬機,該存儲庫將直接返回VM部件。回購將查詢EF實體,然後返回那些簡單DTO的VM位。這是因爲您在顯示數據時不需要驗證和業務規則。

我認爲這是一個很好的做法,保持圖層,尤其是每個圖層的模型分開。爲了更新東西,使用複雜的業務對象(領域模型),這將做艱苦的工作,然後只將他們的狀態轉移到EF(通過存儲庫)。爲了閱讀東西,查詢EF並返回適合VM的簡單DTO。

這就是CQRS的真正意圖:不要試圖在單一模型中適應不同的責任(寫和讀)。

+0

這是我心中所想的,區別在於在抽象服務層中解析AR以避免在控制器或存儲庫中執行該操作。實施差異主要與您的建議有關。所以....會採取AR並將其傳遞給插件和更新從控制器到回購的更新更清潔? – Rich 2012-04-26 13:20:59

+0

你不解析AR。通過命令(來自控制器或服務)將輸入數據映射到AR,然後將AR發送到回購站,並在回購站內將AR映射到EF實體。無論是否存在無關緊要。重要的是保持圖層分離。這就是你如何保持乾淨。 – MikeSW 2012-04-26 13:32:48

+0

對。這就是我解析的意思。感謝帖子! – Rich 2012-04-26 14:04:34