2013-03-27 7 views
5

人のリストを表示するビューがあります。言っビューのために私はPersonListViewModelC#のビューモデルをスコープする方法

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クラス名は、それが何であるかを示します。このクラスは、名前空間で指定された人物およびコンテキストにバインドされています。 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は最も正しいと思われますが(理論的に言えば)、私はより良い解決策が提案されることを期待しています。

答えて

1

それはビューのデータが含まれていない場合Personが、これまでのビューに渡されるのはなぜオプション3となるだろうか? ViewModelsには一般的に、ビューに必要なデータのみが含まれている必要があります。ビューによって消費されるPersonのデータを渡すためにPersonViewModelを作成することには何も問題ありません。ビューがそれを必要としない場合、それを渡さないでください。

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

+0

* ViewModelは、単一のビューの表現を抽象化することを意味します。 * ViewModelはビューのデータが_a_ピースであることを意味しません。 * ViewModelは、オブジェクトの複合ビルドです。これらの各オブジェクトは、ビューモデルではありません。だから、私はそれが最も便利だが、オプション#3を嫌う。 –

+0

ええ、それは興味深い点です。私は明らかにプレゼンテーションの対象であるオブジェクトと明らかにそのドメインの一部であるオブジェクトを明確に区別したい。 ViewModel接尾辞を追加すると、その区別がうまくできます。 – levelnis

+0

はい、私は同意します。そのロジックによって、ビジネス層からのPersonは 'PersonBusinessObject'(奇妙に見える)と呼ばれ、DALのPersonはPersonEntityでなければなりません(これは一般的な習慣です)。私はサフィックス自体を使用しても構いません。もし、 'Person'が属していることを示す接尾辞が見つかったら、(不適切な)ロールではなく、' Person'が演奏します。 –

0

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

関連する問題