【问题标题】:Calling WCF services in MVVM?在 MVVM 中调用 WCF 服务?
【发布时间】:2011-12-28 05:58:58
【问题描述】:

我正在开发一个 Prism 桌面应用程序,想知道在使用 WCF 后端时处理查找/引用数据列表的最佳方式。我认为这个问题可能涉及一些领域,我希望得到一些指导

例如,考虑一个包含产品(代码和描述)的查找,该查找将用于系统中许多不同的输入屏幕。

  1. viewmodel是否直接调用WCF服务获取数据填充控件?
  2. 您是否会创建一个仅处理具有自己的视图模型等的产品的控件,然后在需要查找产品的每个地方使用它,或者您是否会重新实现一个组合框,在每个表单视图模型中重新填充产品 ItemsSource用它吗?
  3. 我是否要创建一个名为 LookupData 服务的全新 WCF 服务并使用它来填充我的查找列表? - 我担心如果我这样做,我最终会得到很多查找。
  4. 还有哪些其他方法可以解决这个问题?

【问题讨论】:

    标签: wpf wcf mvvm prism


    【解决方案1】:

    我建议将您的查找对象/组件创建为 WCF 服务的 proxy 对象。它可以通过多种方式发挥作用,但我想到的最简单的方法是:

    1. 使用方法实现 WCF 服务以提供所有 Products 实体并请求一个(例如,基于产品代码)
    2. 实现将使用WCF客户端获取产品的组件,我们称之为ProductsProvider
    3. 您的视图模型将依赖于ProductsProvider(例如,通过constructor injection

    此模型中的关键元素是ProductsProvider - 它将作为Products 对象的一种缓存。首先,它会要求所有产品(或其中的一部分,取决于您的喜好)的 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 实体的视图模型绝对是个好主意。

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2014-08-23
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多