快適に感じるモデルなら何でも使用できます。はい、すべてのプロパティにINotifyPropertyChanged動作が必要です。これがサービスレイヤーにどのように影響するかは、完全に実装に依存します。
私はあなたがあなたの見解であなたのDTOにバインドすることをあなたがメンションしていると思いますか?
アプリケーションのレイヤー間にインピーダンスの不一致があることがわかります。つまり、ドメインモデルはおそらくリレーショナルモデルと似ていますが、微妙ではありますが重大な違いがあります。ドメインモデルと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の動作をビューモデルの観点から表現する必要があるということです。
はい、それは余分な作業を意味しますが、少し単純化するためにできることがあります(コード生成など)。私は実際に、流暢なAPIを使用してMVVMプロセス全体を簡素化することを目的としたライブラリに取り組んでいます。http://fluentviewmodel.codeplex.com/でチェックしてください