人のリストを表示するビューがあります。言っビューのために私はPersonListViewModel
C#のビューモデルをスコープする方法
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
クラス名は、それが何であるかを示します。このクラスは、名前空間で指定された人物およびコンテキストにバインドされています。 Con:私がこのPerson
インスタンスをビルドするプレゼンター(ほとんどの場合)は、ビジネスドメイン空間からPerson
クラスに衝突するので、そのうち1つにプレフィックスを付ける必要があります。 Con:ビューモデルを含む名前空間を追加する必要があります(ビューモデルの名前空間が既にあるので、必ずしも問題はありません)。
ネストPerson
内側PersonListViewModel
クラスです。 Pro:異なるビューモデルに対して複数のPerson
クラスを持つことができます。 Pro:Person
は、それが属するビューモデルに自然にスコープされます。 Con:ビューとビューモデルの間でPerson
を再利用することはできません。 Inb4:私は、ViewModelsを再利用しないと信じています。私は、適切なときにプレゼンテーションレイヤーに非viewmodelオブジェクト定義を再利用すると信じています。このアプローチでは、このような再利用はできません。また、必要な場合は5%のケースで、別のパターンを作成したくありません。
のPostfix * ViewModelにプロ を持つすべてのプレゼンテーション層のオブジェクトは:再利用と名前の衝突の問題を解決します。 Con:Person
はビューのデータが含まれている場合のビューモデルに過ぎません。たとえば、人のインスタンスが[サブ]ビューに与えられている場合など、それは技術的にはビューモデルであるが、それはPersonListViewModel
のプロパティとして使用される場合、次いでPerson
はビューモデルではないであろう(TotalPersonCount
のせいぜいint
は、それがされていない、ビューモデルではありません)。
これまでのところ、私は私を幸せにする解決策はありません。しかし、ソリューション#1は最も正しいと思われますが(理論的に言えば)、私はより良い解決策が提案されることを期待しています。
* ViewModelは、単一のビューの表現を抽象化することを意味します。 * ViewModelはビューのデータが_a_ピースであることを意味しません。 * ViewModelは、オブジェクトの複合ビルドです。これらの各オブジェクトは、ビューモデルではありません。だから、私はそれが最も便利だが、オプション#3を嫌う。 –
ええ、それは興味深い点です。私は明らかにプレゼンテーションの対象であるオブジェクトと明らかにそのドメインの一部であるオブジェクトを明確に区別したい。 ViewModel接尾辞を追加すると、その区別がうまくできます。 – levelnis
はい、私は同意します。そのロジックによって、ビジネス層からのPersonは 'PersonBusinessObject'(奇妙に見える)と呼ばれ、DALのPersonはPersonEntityでなければなりません(これは一般的な習慣です)。私はサフィックス自体を使用しても構いません。もし、 'Person'が属していることを示す接尾辞が見つかったら、(不適切な)ロールではなく、' Person'が演奏します。 –