2015-07-10 98 views
3

我正在嘗試開發一個小程序,它將與串口上的設備進行通信。該程序將負責格式化用戶輸入的數據以及讀取和顯示設備接收的值。我對WPF和MVVM相當陌生,並且已經對整個數據綁定/ XAML混亂(我認爲)有了基本的瞭解。C#MVVM服務層在哪裏坐?

目前我的理解去是這樣的:

  1. 查看:UI唯一的東西。綁定到ViewModel。
  2. ViewModel:採用模型或模型的各種屬性,並以View可以理解的方式呈現它們。還爲視圖修改模型提供了一種方法。
  3. 型號:UI呈現和修改的數據。

現在我不知道是什麼向ViewModel提供了模型,以至於整個應用程序都知道模型的變化。

該模型目前看起來如下所示。我的設備獲取校準記錄並可以讀回所有校準記錄。

public class Device : ObservableObject 
{ 
    public ObservableCollection<CalibRecord> CalibRecords { get; set; } 

    private SerialPort sp; 

    public Device(SerialPort port) 
    { 
     this.sp = port; 
     this.CalibRecords = new ObservableCollection<CalibRecord>(); 
    } 

    public void WriteCalibration(CalibRecord record) 
    { 
     /* Write a calibration record to the device */ 
    } 

    public void ReadCalibration() 
    { 
     /* Read all calibration records from the device and update CalibRecords */ 
    } 
} 

我正在努力讓一個地方放這個傢伙,讓它可以被整個應用程序訪問。目前我在主窗口的ViewModel中實例化了它,但是除非我將其注入到構造函數中,否則它不能被其他ViewModel訪問。對於一對夫婦來說這很好,但是ViewModel需要的類越多,它就會很快變得笨拙。

也許這就是所謂的「業務邏輯」或「服務層」。你能幫我理解在MVVM應用程序中放置業務邏輯的位置嗎?或者,你們是否有一些我應該關注的例子,主要關注整個應用程序(特別是業務邏輯),而不僅僅是MVVM的東西?

+0

就我個人而言,我會在您的解決方案中使用一些接口創建一個服務層(項目),以促進依賴注入到使用服務功能的應用程序區域,同時這也簡化了服務的單元測試。 – Shawn

回答

4

您對MVVM的理解是正確的,但「教科書描述」並未考慮服務。通常這是通過依賴注入(DI)完成的。定義一個接口,IMyDevice並在MyDevice類中實現它。然後將其註冊到您的DI容器IMyDevice - > MyDevice。通過使用DI容器(正確使用),您還可以擺脫虛擬現實施工圖片。你將有一個VM是這樣的:

public class MyViewModel : ViewModelBase 
{ 
    public MyViewModel(IMyDevice myDevice) 
    { 
    } 
} 

得到VM的一個實例,你會怎麼做:

theDIContainer.Resolve<MyViewModel>(); 

,它將新了MyViewModel類,並自動解決,並通過在IMyDevice實例爲你。

DI還有很多,然後我在這裏覆蓋......只是一個基本的10,000英里高的答案你的問題。閱讀DI並瞭解它如何與MVVM一起發揮作用。