2011-03-25 86 views
3

夥計們,最佳實踐/模式來填充「視圖模型」對象

我試圖找出一個模式或最佳實踐的數據來自於「視圖模型」對象的域對象/數據源轉換。在我的例子中,域對象是WCF代理對象。任何對WCF方法的調用都會填充這些代理對象,這些對象最終會被傳送到'ViewModel'對象。請參閱Architectural diagram

這篇微軟文章:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx談論使用存儲庫模式。它在'數據模型和存儲庫'一節中提到。這是最好的方法嗎?有人可以給我建議嗎?

dorman

+0

我添加了一個類圖,以便我們可以向下鑽取。 [Class Diagram](http://flic.kr/p/9tpBQN)您是否同意B的評論:(見圖) – dormantroot 2011-03-26 11:39:29

回答

1

是的,你需要有一個存儲庫。 這會給你一些優點,比如視圖模型的簡單測試;以後也可以輕鬆切換到另一種存儲庫。

根據您提供的文章,它給了他們單元測試視圖模型邏輯的優勢;之後,他們可以從XML文件存儲庫切換到SQL服務器存儲庫(作爲示例)。

只要確保已將抽象存儲庫注入ViewModel。

+0

Tengiz ...我認爲存儲庫模式只適用於數據源端。就我而言,它將是檢索和插入數據的WCF層。你怎麼看?見類圖....我們可以在任何地方應用Repository模式嗎?請告訴我。謝謝。 – dormantroot 2011-03-26 11:47:23

+0

dormantroot:您不應該操作由域(業務)層中的wcf返回的數據。相反,將wcf層看作數據訪問層,數據來自這個層。因此,在最低限度內,您應該構建一個包含wcf返回對象的域數據對象(實際上,最好在檢索後將wcf對象轉換爲域對象)。因此,您應該使用您的域對象而不是wcf。說得通? – Tengiz 2011-03-26 12:56:10

+0

Tengiz:是的,你是對的!我不會直接使用WCF對象。我會定義創建一個域對象層。我的圖是基於書中的一個例子。所以它將是WCF Objects ----> Domain Objects -----> ViewModel ---> View。那麼,我們可以使用什麼樣的模式,以便WCF對象和域對象鬆散耦合? – dormantroot 2011-03-26 21:20:46

2

存儲庫模式與數據訪問層(WCF內部是什麼)有關。這與表示層無關。

我建議你根據UI的需求(不考慮數據庫模式)在MVC項目中聲明你的Model和ViewModel類。然後,您可以使用AutoMapper來簡化將WCF代理類中的值複製到模型所需的代碼。您可能希望將此代碼封裝在Adapter類中,該類將從AutoMapper代碼中屏蔽其餘應用程序。

編輯:

不要使用您的WCF代理作爲模型類。根據您的UI聲明單獨的模型類並使用AutoMapper在它們之間複製數據。

+0

感謝您的回覆。請參見附加的類圖(註釋A:).....適配器模式是否仍然適用? – dormantroot 2011-03-26 11:44:02

+0

謝謝Jakub ...是的,你是對的!我不會使用WCF代理對象。我指的是我在書中找到的一個例子。所以,回到你的評論,如果我的理解正確,我會做這樣的事情:WCF <---->> AutoMapper <<----->域/模型對象------> ViewModel ----->查看,更正?如果是這樣,我們仍然遇到通過AutoMapper將WCF對象與Domain/Model對象耦合的問題。你怎麼看? – dormantroot 2011-03-26 21:12:31

+0

另外,關於評論B的建議是什麼(在類圖中)? – dormantroot 2011-03-26 21:21:55

0

保持簡單,每班有一個責任。

這表明您的代理(通信對象)返回的對象與ViewModel(視圖對象)使用的對象之間有一些分隔。這樣客戶端邏輯就與通信/傳輸方法分離了。

如果您有與UI元素密切相關的WCF服務,那麼只需將CO從CO轉換爲VO。由於視圖綁定到VO,所以視圖會更新。

如果您需要在客戶端上插入業務邏輯或域邏輯,請轉換爲中間域對象。然後讓對象與其他領域模型對象(您提到的文章中所謂的存儲庫)進行交互。 VO應該監聽域更改並作出相應的反應。這種模式表明域對象不依賴於WCF和WPF。

相關問題