2011-04-07 78 views
1

我從線分叉When using MVVM pattern, should code relating to property changes go in the setter or an event?Silverlight/MVVM設計:我的模型是什麼,在哪裏放置邏輯?

我的MVVM模式的理解與視圖和視圖模型零件OK ......

但對於Model部分?它是技術對象模型(EntityFramework SelfTracking生成的類,然後位於Web服務後面,然後是服務器中的所有業務邏輯)或應用程序邏輯模型(我們將在Silverlight客戶端上基於實體類當然,感謝PRISM項目鏈接器,它會呈現面向GUI的操作,並提供更多業務邏輯,並封裝髒的技術內容以訪問WS以將實體上的修改傳播到數據庫)?

(Personnaly,我想第二個的)

在我們的Silverlight/WCF(不RIA)的項目,我們管理的文件。我們有用於顯示這些文檔的視圖(例如InboxView.xaml),該視圖粘貼到InboxViewModel.cs中,其中包含要顯示的文檔列表。 InboxView中的ListBox是DataBound到InboxViewModel中的DocumentList ObservableCollection屬性。但是列表框ItemTemplate是DataBound到DocumentViewModel.cs,它封裝了實體生成的Document.cs類。

點是這個DocumentViewModel實際上是由其他視圖使用...(對我來說部分合適,如果MVVM確實規定了Views和ViewModels之間的雙射,但這不是我的觀點......)。

在我看來,我寧願有一個DocumentModel.cs而不是DocumentViewModel.cs,它可以被幾個ViewModel(InboxViewModel,EditDocumentViewModel ...)共享,並封裝對WS的調用以觸發業務操作服務器端與客戶端修改實體。然後,我們將在ViewModels(MV-VM)和視圖(M-視圖模型)中具有應用邏輯模型或面向GUI的模型(M -V-VM) V -VM)。所有在Silverlight方面。

但隨後2個問題:

1 - 如果保留我的愚見,這將是確定直接數據綁定一個ItemTemplate到模型對象?由於沒有任何視圖直接綁定到DocumentModel,而是綁定到InboxViewModel(例如,它是DocumentModel對象)中的屬性?

2-更一般地說,服務器端和客戶端實現業務邏輯的部分是什麼?由於服務器旨在將WS展示給其他(虛構的未來或未來虛構:p)應用程序,我們真的想要將所有第一個應用程序業務邏輯放在服務器中,還是隻通過WS公開所有原子操作,並讓所有應用程序實現其正確的邏輯呢?

我的技術領導不斷給我提供參考,但他/他沒有給我任何答案,而且,我只是想在我自己這裏思考。

感謝所有你們的...... 乾杯

回答

1

我想你觸及MVVM的方面是A)求最問題和B)有共識的最低金額。

該模式意味着三層:模型是數據,視圖是屏幕,ViewModel位於它們之間。我開始認爲這是不準確的,或者至少是非最佳的。從數據到屏幕,這裏是我正在努力的方向:

A)服務層:此代碼可能是實際的服務或包裝ADO.NET調用。無論風味如何,其工作都是與物理數據源進行交互。它使用實體(不一定是EF類,只是表示數據庫的類)執行此操作。

B)實體層:這些是服務層獲得的類。來自物理數據源的所有通信都通過這些實體類發生。 D)數據模型層:這些類包裝/管理實體層。具體來說,它們實現INotifyPropertyChanged,以便稍後在視圖中使用它們,並公開用於訪問實體圖層的方法和屬性。該抽象允許更改和更新實體層,而不會對ViewModel或View產生不利影響。 D)ViewModel層:ViewModel類,它也實現INotifyPropertyChanged,管理View和Data Model類之間的交互。命令和具體的visual屬性格式(比如將FirstName和LastName組合成一個FullName屬性)發生在這一層。 ViewModel可以進一步抽象數據模型類,但在這一點上它不應該是必要的。 E)視圖層:最終的視圖(窗口,頁面或用戶控件)。我堅強而快速的規則是保持1 ViewModel每個視圖關係(反之亦然)。

我打電話給這些圖層,因爲這是合乎邏輯的想法:它們如何在物理上實施將取決於您的情況。

FWIW,我最近教了很多MVVM,並鞏固了我對這個架構的想法。我在講授第一件事時說的是,實現MVVM的方法與實現MVVM的人數一樣多。雖然這顯然有點誇張,但這個想法表明你必須找到最適合你和你的情況的東西。

+0

+1我同意您的整體評估。一些註釋:「A」與MVVM無關 - 它是整體架構的一部分(VM可能參考),但不屬於UI開發的關注點。此外,「B」和「C」有時可能重疊,甚至相同,這取決於您的系統。我同意「E」,但我已經看到團隊對ViewModels執行1:M或M:1視圖並使其工作。 – 2011-04-07 20:20:01

+0

謝謝菲爾。 A,B和C都是整個模型層的一部分。服務層是ViewModel與B進行通信以檢索B和/或C.是的,B&C可以重疊,有時它可以,有時不會。我不是故意暗示我的方式是最好的,只是我一直在想的東西:-)例外是我對E的立場:雖然你可以用其他方法取得成功,但從長遠來看,它只會導致麻煩和挫折。 – 2011-04-07 20:53:58

相關問題