5

人のリストを表示するビューがあります。上記のビューのために、私は作成しましたPersonListViewModel

class PersonListViewModel { 
    public IEnumerable<Person> People {get;set;}
    public int TotalPersonCount {get;set;}
    public int PeoplePerPage {get;set;}
    public string OrganizationName {get;set;}
}

私の質問はPersonクラスについてです。Personクラスはどこで定義する必要がありますか? そして、私はそれを何と呼ぶべきですか?

この問題は、境界付けられたコンテキストまたはレイヤー間のマッピング タイプのより一般的な問題のインスタンスです。AutoMapper などを使用してこの作業の一部を実行できることは理解していますが、AutoMapper は問題を軽減するだけで解決しません。

ここに、長所と短所とともに私が検討したいくつかのオプションがあります。

PersonListViewModelPersonクラスの両方を同じ名前空間に入れますWhatever.Organization.ViewModels

長所:Personクラス名は、それが何であるかを示します-人、およびこのクラスが名前空間によって指定されたコンテキストにバインドされます。短所: このインスタンスを作成するプレゼンターでは、 (ほとんどの場合)ビジネス ドメイン スペースのクラスPersonと衝突するため、そのうちの 1 つにプレフィックスを付ける必要があります。Person短所:ビューモデルを含む名前空間を追加する必要があります(ビューモデルの名前空間が既にある可能性があるため、必ずしも問題ではありません)。

クラスPerson内にネストします。PersonListViewModel 長所: 異なるビュー モデルに対して複数のPersonクラスを持つことができます。長所:Person当然、それが属するビュー モデルにスコープが設定されます。短所:Personビューとビュー モデルの間で再利用できません。Inb4: ViewModel は再利用されるべきではないと私は信じています。適切な場合には、プレゼンテーション レイヤーで非ビューモデル オブジェクト定義を再利用することだと思います。このアプローチでは、そのような再利用は許可されません。必要な場合の 5% では、別のパターンを作成したくありません。

すべてのプレゼンテーション レイヤー オブジェクトを *ViewModel Pro で後置: 再利用と名前の衝突の問題を解決します。短所:Personビューのデータが含まれている場合はビューモデルにすぎないため、意味がありません。これは、そうである場合とそうでない場合があります-たとえば、人のインスタンスが[サブ]ビューに与えられた場合-技術的には、ビューモデルですが、PersonListViewModelそれがプロパティとして使用されている場合は、ビューモデルでPersonはありません (ビューモデルではありません)。intTotalPersonCount

これまでのところ、私を幸せにする解決策はありません。しかし、解決策 #1 が (理論的に言えば) 最も正しいようですが、それでもより良い解決策が提案されることを願っています。

4

2 に答える 2

1

オプション 3 を使用します。Personビューのデータが含まれていない場合、ビューに渡されるのはなぜですか? 通常、ViewModel には、ビューに必要なデータのみを含める必要があります。ビューによって消費される acrossPersonViewModelのデータを渡すためにを作成することに問題はありません。Personビューがそれを必要としない場合は、渡さないでください。

を作成しているという事実はPersonListViewModel、ビュー内の人のリストを使用して何かプレゼンテーションを行っていることを意味します。PersonViewModelしたがって、リスト内に保持されている各人物のビューに表示される表示データを保持するための を作成することは完全に理にかなっています。

于 2013-03-27T14:12:47.227 に答える
0

私は3番目のオプションに固執します。あなたが言うように、これは異なるビューモデル間で使用できるようになっており、Person リストをループしているときに単一の Person 要素をパーシャルに渡すだけで OOP の問題は見られません。

于 2013-03-27T14:27:09.023 に答える