鑑於MVC3應用程序使用ViewModel模式和使用實體框架的存儲庫模式。用多個實體保存視圖的MVC3最佳實踐
如果我有一個由多個實體組成的創建和更新視圖,保存數據的最佳做法是什麼?
我應該使用抽象服務層保存日期,該層將保存每個實體的數據與其各自的存儲庫,還是應該使用存儲過程將數據保存到存儲庫中?
我接受任何建議或建議。
在此先感謝!
鑑於MVC3應用程序使用ViewModel模式和使用實體框架的存儲庫模式。用多個實體保存視圖的MVC3最佳實踐
如果我有一個由多個實體組成的創建和更新視圖,保存數據的最佳做法是什麼?
我應該使用抽象服務層保存日期,該層將保存每個實體的數據與其各自的存儲庫,還是應該使用存儲過程將數據保存到存儲庫中?
我接受任何建議或建議。
在此先感謝!
這是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的真正意圖:不要試圖在單一模型中適應不同的責任(寫和讀)。
這實際上取決於實體是如何相關的。一個實體的價值取決於另一個實體的價值嗎?這些實體是否真的只是一個大實體分裂成更小的可管理位? – Garvin 2012-04-25 23:21:39
@Garvin其實只是一個擁有熱切相關實體的大實體。例如,我會急於加載一個小部件的細節,然後必須編輯其中一個細節。由於在檢索數據後我的上下文被丟棄,我相信我必須附加每個相關的實體,然後保存。我必須在主對象的回購的Save方法中這樣做,所以保存所有相關的對象有點誤導。思考? – Rich 2012-04-26 01:16:13