2011-02-07 8 views
0

私はMVC2を使用してサイトを構築し、次のような構造を持っている:デザインの質問

ファクトリー - > Domain.objects - > MVC2

一つの工場がどのアクションの詳細をLOGTYPE、のために列挙型が含まれていますがオブジェクトに適用されています。 ドメインはオブジェクトを要求し、それをMVC2モデルに提供します。これはIEnumerable Ilogとしてビューに渡され、ビューはそのビューを反復処理します。

私の問題は、ビューにログタイプに基づいたリンクを作成したいので、この機能を作成するビューにswitch文があります。 switch文はリポジトリ内でenumを利用していますが、これは私にとっては間違っているようです:リポジトリをビューに公開することです。

ドメイン内のオブジェクトの新しいIListにログタイプをカプセル化する必要がありますか?または、リポジトリでこの列挙型を参照しても問題ありません。

いずれも理想的でない場合、最適な解決策は何ですか?

お手数ですがお手数ですが、

答えて

0

最良の解決策は、ビューモデルを使用することです。ビューモデルは、ビューのニーズに合わせて特別に調整されたクラスです。ここでは、コントローラのアクションのための一般的なワークフローですので:

  1. クエリは、いくつかのドメインを取得するリポジトリが
  2. は、ビューモデルを渡し
  3. AutoMapperがここであなたを助けることができる)、対応するビューモデルにそれらのドメインオブジェクトの地図オブジェクトビューへ

このシナリオでは、ビューにはドメインモデルに関する知識がありません。それは一般的です。

enumの値に基づいて異なるリンクを生成する特定のケースでは、ifとswitchをビューに書くと醜いものになると思います。あなたは見つかりませんか?

<%= Html.MyLink() %> 
+0

ありがとうダーリン!私はビューモデルが何であるかを誤解していたと思います。私はドメインにアクセスしたビューモデルにいくつかのロジックを置いていました。コントローラがドメインにアクセスし、この情報を特定のビューモデルに渡し、結果をドメインに戻す必要がありますか? –

+0

@ misterjingo、ビューモデルにはビューロジックが含まれていますが、ドメインに直接アクセスすべきではありません。これは、マッピングレイヤーを使用して、ドメインとビューモデルの間のブリッジを作成するコントローラです。これはもう一方の方法としても機能します。コントローラのアクション引数としてビューモデルを受け取ると、コントローラはこのビューモデルをモデルにマップし、モデルを渡してリポジトリを呼び出します。 –

+0

私はこれらの変更を加えて、実際に自分のコードを整理しました。私は最後の質問を1つ持っています。私はオブジェクトを渡すためにインターフェイスを使用します。たとえば、私のドメインはリポジトリ(ユーザ)を呼び出し、IUserオブジェクトを受け取ります(IUserの仕様はrepository.users.interfaceにあります)。ドメインがこのIUser定義を使用するのは問題ないと思います。コントローラやビューにIUserの知識がないようにするために、私はIUserをdomainUserにマッピングし、これをコントローラに渡していました。このマッピングはドメイン内かコントローラ内で行われるべきですか? –

0

私の考えで、これはviewmodelのためのそれらの偉大な用途の一つであることと:だから、あなたのビューは次のようになります場合は特に素晴らしいことだビューモデルに基づいて適切なリンクを生成するカスタムHTMLヘルパーを書きますその情報をビューモデルに含めます。

関連する問題