2011-11-18 84 views
0

我的WPF應用程序應通過WCF從管道接收數據: 我是MVVM的新手,我無法理解在哪裏放置一些東西。我很清楚什麼是視圖,但不清楚什麼是ViewModel,尤其是什麼是模型在我的情況下(在WCF涉及的情況下)問題是:我可以使用WCF接口作爲MVVM模型嗎?

  • 什麼是模型?我需要特殊的班級來代表模特嗎?或模型是WCF服務器應用程序?什麼是有效的工作流程「WCF服務器應用程序----命名管道-----> ViewModel < - 數據綁定 - >查看」「WCF服務器應用程序----命名管道----- > Model < ---> ViewModel < - 數據綁定 - >查看「
  • 如何重構下面的代碼?在哪裏把所有這些初始化?到ViewModel?到Model類(如果我需要它),到特殊的「初始化」類?

    public MainWindow() 
    { 
    ChannelFactory<IManagementConsole> pipeFactory = 
    new ChannelFactory<IManagementConsole>(
        new NetNamedPipeBinding(), 
        new EndpointAddress(
         "net.pipe://localhost/PipeMBClientManagementConsole")); 
    
        IManagementConsole pipeProxy = 
         pipeFactory.CreateChannel(); 
    
        List<ConsoleData> datas = new List<ConsoleData>(); 
        foreach (StrategyDescriptor sd in pipeProxy.GetStrategies()) 
        { 
         datas.Add(pipeProxy.GetData(sd.Id)); 
        } 
        this.DataContext = datas; 
    } 
    

我可以假設,這是我的MVVM模型? :

[ServiceContract] 
public interface IManagementConsole 
{ 
    [OperationContract] 
    ConsoleData GetData(int strategyId); 

    [OperationContract] 
    List<StrategyDescriptor> GetStrategies(); 
} 

回答

2

模型是描述來自後端數據源的數據的類。它們可以是來自源代碼的實際類(如EF或WCF代理),也可以是簡單的DTO。這真的取決於你的喜好。

ViewModel是一個描述在View中顯示的數據的類。這些數據通常但不一定是來自Model類。

ViewModel負責管理Model類:將他們的信息暴露給View,並根據View的輸入對他們做些什麼。這就是說,我不想在ViewModel中看到實際的通信工作。相反,我將通信抽象到另一層(我稱之爲服務層,但在這種情況下可能會造成混淆)。

本質上,我有ViewModel向服務層發出請求,後者與後端進行通信以檢索/創建Model對象,然後將其返回給ViewModel。如果服務調用是異步的但是仍然可以完成,這會變得複雜。

舉個簡單的例子,從practicalmvvm.com下載代碼示例。

+0

謝謝,我喜歡那樣!我不喜歡用「溝通」的東西來玷污模特。所以ViewModel最適合MVVM,但引入一個「服務層」可能會有所幫助。這也意味着我需要爲模型添加一個類,並且IManagementConsole不是模型,因爲模型可以包含額外的東西,而不僅僅是來自WCF的數據...服務層應該通過WCF到服務器應用程序並創建在ViewModel中使用的模型實例。 – javapowered

1

我可以假設這個[IManagementConsole]是我的MVVM模型嗎? :

是的,它是(可以)模型。但它不太可能用作ViewModel。

ViewModel'包裝'模型並使其適用於支持UI內容和UI邏輯。

在你的情況下,你會想要一個class ManagementConsoleViewModelclass StrategyDescriptorViewModel

ViewModels實現INotifyPropertyChanged並可能爲數據綁定提供命令和額外屬性。

最好的事情是研究一些基本的MVVM示例(它非常基本,只需將BaseViewModel和RelayCommand類添加到您的項目中),然後決定一個(小)框架。像Caliburn-micro或MVVM-light。

+0

我不想使用'IManagementConsole'作爲ViewModel,我想使用'IManagementConsole'作爲模型 – javapowered

1

可能使用您的WCF服務客戶端作爲MVVM「模型」。但是,經常會生成一個實際的Model類,然後使用WCF服務,因爲通常情況下,單個View和/或ViewModel沒有單個WCF服務。

例如:

public class MyModel 
{ 
    IUsersService usersSrv; 
    ICompaniesService compSrv; 

    public MyModel(IUsersService usersSrv, ICompaniesService compSrv) 
    { 
     this.usersSrv = usersSrv; 
     this.compSrv = compSrv; 
    } 

    public string GetUserAndCompanyName() 
    { 
     return usersSrv.GetUserName() + " belongs to " + compSrv.GetCompanyName(); 
    } 
} 

換句話說,你的模型通常會包含與您查看對應的成員,而你的WCF服務通常包含會員邏輯上一起去。

相關問題