2009-07-27 5 views
5

ドメインエンティティを持ち、基本エンティティが実際のエンティティオブジェクトのサブセットであるシルバーライトアプリケーション内で、MVVMパターンの使用についてこの記事を今日読んだのはhttp://dotnetslackers.com/articles/silverlight/Silverlight-3-and-the-Data-Form-Control-part-I.aspxです。これはドライ原則の明確な違反ではありませんか?もしそうなら、あなたはそれをどうやってうまく処理できますか?Model-View-ViewModelパターンのDRY違反ですか?

答えて

7

個人的には、私はディーノがそこでやっていることが好きではなく、私は同じように問題にアプローチしません。私は通常、モデルクラスのフィルタリング、グループ化、ソートされたコレクションとしてVMを考えています。私のVMはViewへの直接マッピングです。そのため、ビューで使用される複数のCollectionViewを持つNewOrderViewModelクラスを作成することがあります。私の意見では、モデル内のすべてのクラスに対してまったく新しいVMクラスを作成することはDRYに違反します。むしろ、View固有の(しばしば計算される)プロパティを追加して、必要に応じてモデルを補強するために派生クラスまたは部分クラスを使用したいと思います。 IMO .NET RIA Servicesは、MとVMのデータを、クライアントとサーバーの両方で使用可能な追加ボーナスと組み合わせる優れた実装です。ディノは華麗な男ですが、この人に彼を呼び出す方法です。

+0

合意しました.VMは、Viewが知っておくべきモデルの部分でなければなりません。 –

2

DRYは原則であり、厳しいルールではありません。あなたは人間であり、差別化することができます。 など。 DRYが本当に難しいルールだった場合は、2つの異なる変数に同じ値を割り当てることは決してありません。私は平凡なプログラムでは、値0を含む複数の変数があると思います。

一般的に言えば、DRYは通常データには適用されません。これらのビュー固有のエンティティは、おそらく注目すべき論理がないデータ転送オブジェクトのみである。データはあらゆる種類の理由で複製される可能性があります。

+0

viewmodelの軽いエンティティクラスを作成し、実際のエンティティを繰り返しているので、これはかなり悪いです。 – terjetyl

+0

なぜこれが悪いのですか? – EricSchaefer

+0

継承を使用せずに同じエンティティを表す2つのほぼ同一のクラスを作成しているため、その乾燥が悪いと思われます – terjetyl

1

答えは実際にあなたがViewModelにあるべき気持ちに依存していると思います。私の場合、ViewModelは、現在表示されている画面のモデルを表します。

ViewCategoryViewModelのようなものでは、カテゴリのフィールドが重複していません。 ViewModelのプロパティ(たとえば、 "SelectedCategory")、ビューが表示する必要がある他のデータ、および画面が取ることができるコマンドに、Categoryオブジェクトをプロパティとして公開します。

ドメインモデルとビューモデルの間には常に類似点がありますが、ViewModelの作成方法はすべて同じです。

1

データ転送オブジェクト(DTO)と同じです。これら2つのオブジェクト型のため

ドメインは異なるので、それはDRYの違反ではありません。

class Customer 
{ 
    public int Age 
} 

そしてcorspondingビューモデル:: - differnetのプロパティタイプ - 異なるオブジェクト

class CustomerViewModel 
{ 
    public string Age; 

    // WPF validation code is going to be a bit more complicated: 
    public bool IsValid() 
    { 
     return string.IsNullOrEmpty(Age) == false; 
    } 
} 

Differntドメイン

は、次の例を考えてみましょう。

+0

1.このコンテキストでドメインとは何ですか? 2.あなたのビジネスモデルには顧客エンティティがあります。 Customerエンティティ、Customer DTO、CustomerViewModelがあるとします。もちろん、そこには重複したプロパティがたくさんあります。私はこれをDRY – terjetyl

+0

の明確な違反とみなしています。1.顧客はおそらくNHにデータベースにマップされています。それは、完璧ではないDBスキーマのためにハッキングを含むことさえあります。多くのビジネスメソッド、コレクションがありますが、これは画面に表示するときには必要ない可能性が最も高いです。 2. SRPは、CustomerクラスがMVPのビジネスモデル、DTO、ViewModelとして使用されている場合、SRPを明らかに揮発させるよりも、オブジェクトを変更する理由が1つだけである必要があることを示しています。クラスが1つだけの方が簡単な状況があることに同意します。すべてがコンテキストに依存します。 –

+0

ViewModelでIsSelectedのようなプロパティを検討し、画面上でエディションをキャンセルする(CustomerViewModelクラスをバインドしていない場合はCustomerオブジェクトを元に戻す必要があります)、INotifyPropertyChangedを実装します。非常に単純化されたシナリオにおいてのみ、DRYの違反のように思えます。 –

関連する問題