2011-11-14 16 views
3

ここで私は苦労している状況です。 私はオブジェクトモデルを持っている:asp.netのリポジトリとViewModel mvc 3

public class MyModel 
{ 
    public string Prop1 {get; set;} 
    public string Prop2 {get; set;} 
//etc 

} 

その後、私は私がmymodelというの削除、更新操作を実行しているだけでなくMyModelRepositoryクラスを持つオブジェクトのModelView

public class MyModelView 
{ 
    public MyModel MyModelObject; 

    public SelectList PropToBeSelected1 {get; set;} 
    public SelectList PropTobeSelected2 {get; set;} 
//etc 

} 

を持っています。

これまでのところすべて良好でクリアです。

質問: PropToBeSelected1とPropTobeSelected2は、内容がデータベースから来たドロップダウンリストです。これらのコンテンツを取得するメソッドは、MyModelRepositoryに配置する必要がありますか? ViewModelの別のリポジトリを作成する必要がありますか?

ありがとうございます。

答えて

1

まず、あなたのviewModelにdomian-ishオブジェクトが本当に必要ないのですか?あなたのviewModelはプリミティブ(文字列、ints ...など)だけできれいにする必要があります。だから、a AutoMapperを使用して2つの文字列小道具をviewModelにマップすることをお勧めします。

選択リストでは、これについて多くの方法がありますが、プロパティのリストであれば実際のエンティティではなく値オブジェクトであると想像することができます。この場合、それらのためのリポジトリを作成することは、過剰な殺害であり、悪いデザインにつながります。

私はあなたのMyModelRepositoryにプロパティリストの 'get'を置いていました。何かのように

_myModelRepository.getProperties1For(myModel); 

あなたの選択リストを取得するために再びオートマップ。

編集: @ M.Radwanが複雑なドメインモデルを指摘したように、私は簡単にマッピングできるようにviewModels insid viewModelsを作成します。

ドメインModel--

public class User : Entity 
{ 
    public Address Address { get; set; } 
} 
public class Address 
{ 
    public string Street { get; set; } 
    public string Zip { get; set; } 
} 

は、我々の経験であなたのViewModelに任意の複雑さを追加するための唯一の理由となっている

public class DetailsViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public AddressViewModel Address { get; set; } 

    public class AddressViewModel 
    { 
    public string Street { get; set; } 
    public string Zip { get; set; } 
    } 
} 

にマップします。 SelectListsをviewModelに配置しますが、最近は内部ビューモデルのIEnumerableを使用し、カスタムEditorForまたはDisplayForを呼び出してドロップダウン/チェックボックス/ラジオボタンのリストに変換しています。

+1

このリンクを参照してくださいのように見え、そしてより多くのDevMagicFakeについての情報と、このアプローチのために

に行う必要があり、私は彼の意見のほとんどで@jasonhootenに同意するすべてではないと私はいつも使用したマッピングレイヤーを作成することはできますが、y私たちのViewModelは複雑ですが、メインビューの部分ビューに渡される別のViewModelsと複雑です –

+0

はい、私はそれを明確にすべきです。複雑なドメインモデルでは、マップを簡単にするために、複数の内部ビューモデル(プリミティブまたは他のviewModelで構成されています)を作成します。 例を示すために私の答えを変更します。 – jasonhooten

+0

良い努力:-) –

1

答えはいいえ、このビューで本当に必要な場合は、リポジトリを作成しないでください。@jasonhootenが述べたように、値オブジェクトである可能性があります。また、リポジトリで使用される主な集約オブジェクトに接続する必要があります。

最後に、ビューを終了して最初に動作させるまでViewModel構造を決定しませんDevMagicFakeを創設してDevMagicFakeを作成すると、ViewModelやリポジトリの構造やサービス層の使い方に関するデザインの決定がすべて遅れることになりますが、これはすべてビューを完全に完了した後に遅れてしまい、

したがって、私はちょうど次のようにアクションメソッドを作成します

(BDD(Behavior Driven Development)とTDD(Test Driven Development))

この偽のリポジトリを使用すると、複雑なモデルであっても全体のモデルを保存して取得することができ、全体のビューを完了して最初に機能させるまでは、本当のデザインと本当のリポジトリが

DevMagicFake on CodePlex

関連する問題