2011-11-13 32 views
2

我正在使用Prism桌面應用程序,並希望知道使用WCF後端時處理查找/引用數據列表的最佳方式。我認爲這個問題可能涉及幾個方面,我希望得到一些指導在MVVM中調用WCF服務?

例如,考慮包含產品(代碼和說明),這將在很多系統中的不同的輸入屏幕使用的查找。

  1. viewmodel是否直接調用WCF服務來獲取數據以填充控件?
  2. 你創建一個控件,僅涉及的產品有自己的視圖模型等,然後使用在每一個需要的產品查找,還是會重新農具說,重新填充產品的ItemsSource在每一個表格視圖模型的組合框的地方使用它?
  3. 我會創建一個名爲像LookupData服務一個全新的WCF服務,並用它來填充我查找列表? - 我擔心,如果我這樣做,我會結束很多查找。
  4. 什麼其他的方法是那裏去這件事?

回答

2

我建議創建查找對象/組件作爲WCF服務的proxy對象。它可以在幾個方面的工作,但最簡單的來我的腦海裏:

  1. 與方法來實現WCF服務提供所有Products實體,並要求一個(產品代碼如築底。)
  2. 實施將使用WCF客戶將產品組件,讓我們把它叫做ProductsProvider
  3. 您的視圖模型將在ProductsProvider依賴(例如,通過constructor injection

這個模型中的關鍵元素是ProductsProvider - 它將作爲Products對象的一種緩存工作。首先,它將詢問所有產品的Web服務(或者其中的一部分,根據自己的喜好)開始。然後,當你需要查找的產品,你問提供商 - 這是供應商的責任處理的產品應該如何擡眼 - 也許它已在本地列表?也許它需要調用Web服務進行更新?例如:

public class ProductsProvider 
{ 
    private IList<Product> products; 
    private IProductsService serviceClient; 

    public ProductsProvider(IProductsService serviceClient) 
    { 
     this.serviceClient = serviceClient; 
     this.products = serviceClient.GetAllProducts(); 
    } 

    public Product LookUpProduct(string code) 
    { 
     // 1: check if our local list contains product with given code 
     // 2: if it does not, call this.serviceClient.LookUpProduct 
     // 3: if service also doesn't know such product: 
     // throw, return null, report error 
    } 
} 

現在,這給你的是:

  • 你只需要擁有一個ProductsProvider實例
  • 更好的靈活性,何時以及如何你的服務被稱爲
  • 您視圖模型不會有根本
處理WCF

編輯:

至於你的第二個問題。控制可能不是必需的,但具有Product實體的查看模型絕對是一個好主意。