如何在视图模型中反映应用服务器模型中所做的更改
本文关键字:服务器模型 应用 视图 模型 | 更新日期: 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。
当然,简单地重新查询数据库中的所有数据更容易,但可能会花费太多的带宽和/或处理时间。