首页 文章

WPF MVVM WCF客户端/服务器体系结构

提问于
浏览
4

我想构建一个基本的wpf / mvvm应用程序,它从具有WCF的服务器获取数据,并允许客户端显示/操作(使用CRUD操作)此数据 .

到目前为止,我为这个架构考虑了类似的东西:

  • a "global"模型层,实现验证,研究标准,以及INotifyPropertyChanged和服务 Contract

  • 一些服务层,主要是一个用于实体框架4,实现模型层的 Contract 并允许我访问和操作数据 .

  • 请注意,我想要一个离线数据源,比如XML或其他东西,因此另一个服务(我计划使用一些DI / IoC)

  • WCF层

  • 数据存储客户端的额外层?

  • ViewModel

我对Views / ViewModel部分很清楚,但是我很难搞清楚模型,WCF和viewmodel之间的关系 .

我的问题是:

  • 我该如何处理EF生成的模型?摆脱它并采用代码优先方法,手动与数据库进行映射?

  • 对于WCF数据传输,我的模型中是否应该有关系属性,即Product有Customer而不是CustomerId?

  • 我应该在WCF和ViewModel之间有一个额外的层,用于存储和操作数据,还是将ViewModel直接插入WCF的最佳做法?

欢迎任何其他有关此类架构的提示......

2 回答

  • 2

    针对3层WPF应用程序的体系结构有不同的解决方案,但这里有一种可能性:

    1 2)一种解决方案是创建表示客户端应用程序实际需要的“中间”对象 . 例如,如果您的应用程序需要显示有关产品的信息以及相关的客户名称,则可以构建以下对象:

    public MyProduct
    {
        // Properties of the product itself
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        ...
    
        // Properties that come from the Customer entity
        public string CustomerName { get; set; }
    }
    

    然后,您可以公开从ID返回产品的无状态WCF服务:

    [ServiceContract]
    MyProduct GetProductByID(int productID);
    

    在应用程序的服务器端(即服务的实现),您可以通过EF(每次调用一个上下文)查询数据库来返回 MyProduct 实例构建:

    public MyProduct GetProductByID(int productID)
    {
        using (DBContext ctx = new ....)
        {
            return from p in ctx.Products
                where p.ID == productID
                select new MyProduct
                {
                    ProductID = p.ID,
                    ProductName = p.Name,
                    CustomerName = p.Customer.Name  // Inner join here
                };
        }
    }
    

    3)在WCF服务和ViewModel之间添加额外的层可能被视为过度工程 . 恕我直言,可以直接从ViewModel调用WCF服务 . WCF生成的客户端代理代码具有模型的实际角色(至少是模型的一部分) .


    编辑:

    为什么MyProduct应该引用CustomerName而不是Customer.In我的情况下,Customer会有许多我要使用的属性 . 这个“映射”不是太贵了吗?

    您可以使用实际实体 . 但在客户端,由于它是3层体系结构,因此您无法通过导航属性访问数据库 . 如果存在嵌套的 Customer 属性(类型为 Customer ),则客户端可以访问 theProduct.Customer.Products ,这没有意义,您不能以这种方式延迟加载实体(客户端没有DB上下文) .

    扁平的“中间”POCO更简单的IMO . 没有性能问题,映射很简单,并且与DB请求时间相比,此特定操作的CPU使用率是无穷小的 .

  • 4

    首先,一些一般信息:Jason Dollinger有一个关于MVVM的非常好的教程available at Lab49

    edit 该视频涵盖了构建WPF应用程序时的大部分需求 . 还介绍了依赖注入和与WCF的连接(但在谈到WCF时却没有深入讨论,但是在这里提出了很好的解决方案)

    他开发的源代码也是available here

    在我看来,每个与MVVM有关的人都应该看到它!

    => 1.我应该如何处理EF生成的模型?摆脱它并采用代码优先方法,手动与数据库进行映射?

    AutoMapper可以在这里提供帮助 . Codeplex of AutoMapper您的问题似乎非常适合这个!

    => 2.对于WCF数据传输,我的模型中是否应该有关系属性,即Product有Customer而不是CustomerId?

    不要乱用模型! productid是订单的一部分,订单具有客户ID . 坚持这一点 . 在您的服务层中,您最终可能会得到ID . 既然你可能不会在这里改变产品或客户 . 如果你这样做(并且我的订单示例不合适),你可以传输动态数据,而不是静态数据 .

    => 3.我之间是否应该有一个额外的层WCF和ViewModel,用于存储和操作数据,或者是将ViewModel直接插入WCF的最佳实践?

    在大多数情况下,我有一个服务层,在构造函数中注入了我的viewmodel . 这可以假设为另一层,因为它处理WCF客户端部分并处理服务器端的“已更改”事件 . (行已更改,新行,行已删除等)

    edit 如果必须调度服务层事件,在WCF和ViewModel之间使用那么小的轻量级层要容易得多 . 只要你必须,你可能会自然地想出这样一层 .

相关问题