2010-11-30 64 views
0

一種常見的MVVM/WPF方法是將UI的控件直接數據綁定到底層模型對象。模型對象可能包含自己的驗證邏輯(可能通過IDataErrorInfo公開),也可能由輔助類驗證模型對象實例是否有錯誤進行驗證。無論哪種情況,有時模型中都有無效數據,因此處於無效狀態。將MVVM(WPF)與基於DDD的模型一起使用時的驗證

但是,在DDD世界中,模型永遠不會處於無效狀態。您如何建議在使用WPF和DDD時執行驗證?

感謝,

+0

在DDD中說直接綁定到MVVM中的模型? – Aliostad 2010-11-30 21:53:22

+1

如果你直接綁定到模型,你不能僅僅使用ValidationRules(甚至只是ValueConverters)來防止綁定將無效數據轉發給模型嗎? – Moonshield 2010-11-30 22:12:34

回答

1

我傾向於認爲應該使用外觀或類似層作爲MVVM「模型」。該外觀可能處於無效狀態(不像DDD型號)。對於驗證,它可以包含自己的邏輯或像FluentValidation這樣的工具可以使用。一旦它處於有效狀態,就可以調用它的「do action」函數。這會將外觀中的數據傳遞給底層的DDD模型。採用這種方法,DDD模型在任何時候都不會遇到無效數據。

通過這種方法,Facade及其驗證邏輯可以被多個視圖/視圖模型對使用,消除了當每個視圖模型進行自己的驗證時存在的驗證邏輯重複。

1

我不認爲在MVVM的視圖應直接綁定到域模型,它真的應該結合視圖模型來代替。然後,視圖模型可處於可通過IDataErrorInfo反映的「無效」狀態。僅當稍後用戶操作(例如保存,確定,應用)將此應用於底層域模型時,如果域模型強制執行有效性,則還可以通過不允許在UI中進行操作來阻止應用。

儘管我必須說我發現在一定程度上重複驗證邏輯並不總是很容易。

+1

您的最後一段提到了這種方法帶來的負面影響 - 驗證邏輯成爲特定於虛擬機的事實,並傾向於最終在與相同基礎模型交互的每個虛擬機中重複。 – 2010-12-02 16:11:12

0

驗證屬於您的業務邏輯(域模型)。我建議看一看.NET的FluentValidation

我已經有了ViewModel setter調用底層Model對象並讓FluentValidation拋出異常的好運氣。如果您使用的是WPF文本框,則綁定將繼續工作,但TextBox將顯示一個紅色輪廓(假設您已經使用TextBox在每次擊鍵時更新ViewModel的語法)。只是不要在getter中拋出異常,否則你會破壞綁定。

最好是將所有通信從ViewModel路由到某個中介(我介紹了一個Presenter,但這可以像將lambda傳遞給某個中介上的回調一樣簡單)。當在模型上操作時發生異常時,Presenter捕獲異常並向用戶顯示一條友好的消息,其中包含異常的詳細信息。 FluentValidation爲此目的生成非常好的默認錯誤消息。