Wpf 我应该在MVVM中使用DTO作为数据模型吗?

Wpf 我应该在MVVM中使用DTO作为数据模型吗?,wpf,architecture,mvvm,dto,Wpf,Architecture,Mvvm,Dto,我目前正在研究什么将是我第一次真正尝试使用MVVM,并且已经阅读了关于如何最好地实现它的各种文章 我目前的想法是将我的数据模型有效地用作数据传输对象,使它们可序列化,并使它们同时存在于客户端和服务器端。 考虑到这两种对象类型实际上只是属性getter和setter的集合,这似乎是一个合乎逻辑的步骤,而介于两者之间的另一层似乎完全是多余的 显然,INotifyPropertyChanged在服务器端无法正常工作会出现问题,因为没有要与之通信的ViewModel,但是,只要我们小心地从服务层的数据模

我目前正在研究什么将是我第一次真正尝试使用MVVM,并且已经阅读了关于如何最好地实现它的各种文章

我目前的想法是将我的数据模型有效地用作数据传输对象,使它们可序列化,并使它们同时存在于客户端和服务器端。 考虑到这两种对象类型实际上只是属性getter和setter的集合,这似乎是一个合乎逻辑的步骤,而介于两者之间的另一层似乎完全是多余的

显然,INotifyPropertyChanged在服务器端无法正常工作会出现问题,因为没有要与之通信的ViewModel,但是,只要我们小心地从服务层的数据模型构建适当的域模型对象,而不是在服务器端处理数据模型,我认为这不应该是一个大问题

在我的阅读中,我没有发现太多关于这种方法的信息,所以我想知道这是否是一个相当标准的东西,这是否只是假设在多层环境中使用MVVM的实际方式?
如果我对事物有完全错误的想法,那么考虑其他方法也会很感激。

我不是这方面的专家。我也有同样的情况。我同意你的看法,那是相当过分的。我已经使用这个解决方案很长时间了,没有遇到任何问题。INotifyPropertyChanged对我来说不是什么大问题,因为服务器端没有任何内容会订阅PropertyChanged事件。如果要在数据模型上使用继承,则所有数据模型都必须是可序列化的。在我的场景中,我的数据模型有两个基类:一个用于数据传输,另一个不用于数据传输。

您可以使用任何您觉得合适的模型,是的,所有属性都需要INotifyPropertyChanged行为。这将如何影响服务层完全取决于您的实现

我假设你认为你和你的DTO绑定在一起

我认为应用程序层之间存在阻抗不匹配,这是您的问题 域模型可能与您的关系模型更相似,但有细微但关键的区别。还有 域模型和DTO之间不匹配(对象可能被展平、计算属性等)。直接绑定到DTO是很有诱惑力的,因为它们可能被设计为具有特定操作所需的内容,但是DTO和视图所需内容之间也存在阻抗不匹配,以实现设计的结果。这就是视图模型的作用。视图模型负责将DTO属性代理给视图,它负责让视图知道是否存在验证错误,并将命令路由到相应的处理程序(保存、删除等)

我倾向于按以下方式设置:

// POCO object. Serializable.
public class AddressDto 
{    
   public int Id { get; set; }
   public string Street { get; set; }    
   public string City { get; set; }    
   public string Country { get; set; } 
}

// IDataErrorInfo for validation.
public class AddressViewModel : INotifyPropertyChanged, IDataErrorInfo
{
   private readonly AddressDto addressDto;

   public AddressViewModel(AddressDto addressDto)
   {
      this.addressDto = addressDto;      
   }

   public int Id { /* get and set for property changed event and update dto */ }
   public string Street { /* get and set for property changed event and update dto  */ }
   public string City { /* get and set for property changed event and update dto  */ }
   public string Country { /* get and set for property changed event and update dto  */ }
   ...

   // IDataErrorInfo implementation
}

public class EditAddressViewModel : INotifyPropertyChanged
{
   public AddressViewModel Address { /* get and set for property changed event */ }
   public ICommand Save { /* setup command */ }
   public ICommand Cancel { /* setup command */ }

   private void Save()
   {
   }

   private void Cancel()
   {
   }
}
然后,您的EditAddressView将绑定到EditAddressViewModel。基本上,规则是所有UI行为都应该用视图模型表示


是的,这确实意味着额外的工作,但是您可以做一些事情来简化一些事情(代码生成等)。实际上,我正在开发一个库,旨在使用fluent api简化整个MVVM过程。请访问

我决定在我的ViewModel上有一个属性“Model”。在模型本身中,我已经实现了IPropertyNotifyChanged和IDataErrorInfo。因此,在我的ViewModel中,我跳过了一些属性,在这些属性中,代码只会“掉到”模型中。相反,视图直接绑定到这些属性的模型


对于更复杂的情况,我必须调整模型中的数据以适应视图,我在ViewModel中执行此操作。此外,命令等也在ViewModel中。但是我看不出有什么理由让ViewModel中的样板代码重复我在模型中已经拥有的内容。

谢谢,目前似乎没有真正定义的共识。考虑到你以前做过类似的事情,没有任何问题,我接受这个答案。