如何在视图模型中反映应用服务器模型中所做的更改

本文关键字:服务器模型 应用 视图 模型 | 更新日期: 2023-09-27 18:15:11

每个人。

序言让我们来看看这种典型的情况。这里有三层应用程序:

  • WPF(或者Silverlight,没关系(客户端,建立在MVVM之上
  • WCF服务(应用服务器(
  • 一些RDBMS作为存储

以下是简单的"订单项目"域模型:

[DataContract(IsReference = true)]
public class Order : INotifyPropertyChanged
{
    [DataMember]
    public Int32 Id { ... }
    [DataMember]
    public Decimal Total { ... }
    [DataMember]
    public Decimal Discount { ... }
    [DataMember]
    public ObservableCollection<OrderItem> Items { ... }
}
[DataContract(IsReference = true)]
public class OrderItem : INotifyPropertyChanged
{
    [DataMember]
    public Int32 Id { ... }
    [DataMember]
    public String Name { ... }
    [DataMember]
    public Decimal Price { ... }
    [DataMember]
    public Decimal Quantity { ... }
    [DataMember]
    public Order Order { ... }
    [DataMember]
    public Int32 OrderId { ... }
}

属性Order.Id和OrderItem.Id是标识属性。属性Order。Total和Order。Discount是计算属性。身份和计算属性不能在客户端设置,它们必须在服务器上设置,它们的值取决于服务器的逻辑。此外,应用程序服务器可以添加新的物品(例如礼物(,或修改现有物品的数量(取决于库存状态(。

在客户端,这些模型被封装到相应的视图模型中:

public class OrderVM : INotifyPropertyChanged
{
    private Order model;
    public OrderVM(Order model)
    {
        this.model = model;
        ...
    }
    public Int32 Id { ... }
    public Decimal Total { ... }
    public Decimal Discount { ... }
    public ObservableCollection<OrderItemVM> Items { ... }
    // ...
}
public class OrderItemVM : INotifyPropertyChanged
{
    public OrderItemVM(OrderItem model)
    {
        ...
    }
    public Int32 Id { ... }
    public String Name { ... }
    public Decimal Price { ... }
    public Decimal Quantity { ... }
    // ...
}

模型类实现了INPC,所以,如果模型在UI之外发生了更改,视图模型将反映这些更改。

应用程序服务器是WCF服务。这是它的合同:

[ServiceContract(...)]
public interface OrderService
{
    [OperationContract(...)]
    Order SaveOrder(Order order);
}

OrderService.SaveOrder的作用:它接收订单,检索标识和计算的属性,更改订单(添加或更改项目(,并将相同的订单返回给客户端。

OrderVM有一个命令"Apply"。显示OrderVM的视图有一个按钮,该按钮绑定到OrderVM.Apply。OrderVM.Apply必须调用OrderService.SaveOrder:

void ApplyExecute()
{
    var savedOrder = ordersService.SaveOrder(model);
}

这个问题从CLR的角度来看,源订单(字段OrderVM.order(和savedOrder是不同的对象。我需要反映更改,这些更改现在出现在savedOrder中,所以它们必须显示给用户。

有没有什么共同的方法或最佳实践,如何做到这一点?请考虑:

  • 命令是"应用",而不是"保存并关闭":用户必须保持在相同顺序的同一视图中
  • 这是一个简单的模型,真实的模型会更复杂

谢谢。

如何在视图模型中反映应用服务器模型中所做的更改

一种常见的方法是创建更新批处理/存储过程,该过程不仅可以更新/插入/删除数据,还可以查询数据库中的新数据。

调用此批处理时,您将收到新值,并能够相应地更新模型和ViewModel。

当然,简单地重新查询数据库中的所有数据更容易,但可能会花费太多的带宽和/或处理时间。