人のリストを表示するビューがあります。上記のビューのために、私は作成しました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 は問題を軽減するだけで解決しません。
ここに、長所と短所とともに私が検討したいくつかのオプションがあります。
PersonListViewModel
とPerson
クラスの両方を同じ名前空間に入れますWhatever.Organization.ViewModels
。
長所:Person
クラス名は、それが何であるかを示します-人、およびこのクラスが名前空間によって指定されたコンテキストにバインドされます。短所: このインスタンスを作成するプレゼンターでは、 (ほとんどの場合)ビジネス ドメイン スペースのクラスPerson
と衝突するため、そのうちの 1 つにプレフィックスを付ける必要があります。Person
短所:ビューモデルを含む名前空間を追加する必要があります(ビューモデルの名前空間が既にある可能性があるため、必ずしも問題ではありません)。
クラスPerson
内にネストします。PersonListViewModel
長所: 異なるビュー モデルに対して複数のPerson
クラスを持つことができます。長所:Person
当然、それが属するビュー モデルにスコープが設定されます。短所:Person
ビューとビュー モデルの間で再利用できません。Inb4: ViewModel は再利用されるべきではないと私は信じています。適切な場合には、プレゼンテーション レイヤーで非ビューモデル オブジェクト定義を再利用することだと思います。このアプローチでは、そのような再利用は許可されません。必要な場合の 5% では、別のパターンを作成したくありません。
すべてのプレゼンテーション レイヤー オブジェクトを *ViewModel
Pro で後置: 再利用と名前の衝突の問題を解決します。短所:Person
ビューのデータが含まれている場合はビューモデルにすぎないため、意味がありません。これは、そうである場合とそうでない場合があります-たとえば、人のインスタンスが[サブ]ビューに与えられた場合-技術的には、ビューモデルですが、PersonListViewModel
それがプロパティとして使用されている場合は、ビューモデルでPerson
はありません (ビューモデルではありません)。int
TotalPersonCount
これまでのところ、私を幸せにする解決策はありません。しかし、解決策 #1 が (理論的に言えば) 最も正しいようですが、それでもより良い解決策が提案されることを願っています。