大家。
序言。 让我们来看看这种典型情况。这是3层应用程序:
以下是简单的“订单商品”域名模型:
[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中的更改,因此必须向用户显示这些更改。
有没有共同的方法或最佳做法,如何做到这一点? 请考虑到:
感谢。
答案 0 :(得分:0)
一种常见的方法是创建更新批处理/存储过程,不仅可以更新/插入/删除数据,还可以在数据库中查询新数据。
调用此批处理时,您会收到新值,并且可以相应地更新模型和ViewModel。
当然,只需重新查询数据库中的所有数据就更容易,但可能会花费太多的带宽和/或处理时间。