2009-03-31 25 views
2

私はASP.NET MVCを初めて使い慣れており、現時点ではいくつかの設計コンセプトについて頭を下ろそうとしています。私が現在取り組んでいることの1つは、以下のような状況をどのように処理するか(最善の方法)です。MVCパーシャルビュー、モデルなど

複数の「セクション」をレンダリングする必要があるページがあるとします。たとえば、左側にはデータ駆動型のリストがあり、リスト内の選択された項目はページ上の別のセクションに表示されます。理解を深めるために、左側のリストは映画カテゴリのリストであり、もう一方のリストは様々な映画の詳細とともに、そのカテゴリに含まれる映画のリストを表示することを示唆させる。

ここでは、Entity Framework、LINQ to SQL、またはtblCategoryおよびtblMovieデータベーステーブルをそれぞれカテゴリとムービーエンティティにマップする何らかの形式のORMがあります。これらのエンティティは、MyMVCApp.Data.Entities名前空間に存在します。次に、MyMVCApp.Data名前空間にあるリポジトリパターンを使用して、これらのエンティティに対するクエリ(LINQ経由)をカプセル化し、モデルエンティティを返します。

これは私の最初の質問にあります。リポジトリはビューモデルエンティティまたはドメインエンティティを返すべきですか?それからビューモデルエンティティを生成するために拡張されますか?私の素朴な考え方では、ORMから返されたエンティティは、ビジネスロジックを含むドメインエンティティを持つデータのコンテナであることがわかります。だから確かにここに禁欲があるはずですか?

とにかく、私のシナリオに戻ってください。ここで、この冒頭で説明した2つのセクションを提示したいと考えてみましょう。私はここで何が起こっている必要があると仮定しています私のドメインエンティティモデルは、カテゴリのリストと関連付けられている映画が含まれています。 Listのようなものなので、それぞれListを含んでいます。

このモデルはどこかに入力されていました。これは私の2番目の質問です。上記の私の仮定は正しいと単純に、データエンティティはORMから返されます。今度は、前の段落で言及したムービーやカテゴリエンティティなどのドメインエンティティを持つMyMVCApp.Core.Model(または同様のもの)という名前空間/プロジェクトがあります。これらのエンティティには、ORMからデータを取得してデータを取り込むためのメソッドがありますか?あるいは、リポジトリは、これらの移入されたエンティティモデルを取得しますか? ORMにMovieエンティティとCustomerエンティティがある場合、この部分のもう1つの質問は、同じ名前のドメインエンティティを持つことは容認できますか?

最後に、コントローラに、カテゴリとムービーオブジェクトのこのポピュレートされたリストがあり、それをビューに戻すと仮定します。私はそれが部分的なビューとして最初に記載されたセクションのそれぞれを持って、それぞれに人口モデルを渡すことをお勧めしますか?したがって、Populated CategoryMoviesエンティティを取得し、これをCategory部分ビューとMovies部分ビューに渡すIndexControllerである可能性があります。私は何とか選択したカテゴリ(quesrystring?)を決定し、ビュー内のそのカテゴリの適切なムービーリストを表示する必要があります。

だから誰でも私の話題でこの点に着いているなら、私は深い弓をとるだろう。私は、誰かがある種の啓蒙を提供するのに十分なほど詳細な考えと質問が混在していることを説明してくれることを願っています。

お寄せいただきありがとうございます! :-)

答えて

1

まず、簡単なプロジェクトを始めて、あなたの長い質問で描いたさまざまなシナリオを試してみてください:)。石で書かれたものは何もありません。どのようなアーキテクチャーでもデーターやサービスを利用することができます。

または、リポジトリはこれらの移入されたエンティティモデルを取得しますか?

私はイエスと言うでしょう。あなたのコントローラーは、サービスからこれらを取得し、それらを取得し、表示されたビューに移動します。

最初に説明した各セクションを部分的なビューとしてそれぞれのモデルに渡すのが最もよいと思いますか?

そして再び、私はあなたが正しい軌道に乗っていると思います;)。

2

あなたはそれについて言及していないので、私はあなたがDDDの概念の初心者であると考えます。 DDDは、それが所属するロジックを配置することによってMVCの「M」を補完します。そして、私はここで良い量が適用できると思います。

厳密なDDD形式では、ムービーの例を集計ルート(DDDの概念)として使用します。ムービー内では、ムービーに直接関係するカテゴリや関連エンティティ(カテゴリ - this-movie-belong-in)を取得するビジネスロジック(メソッド)があります。これは、表示したい「カテゴリ」リストには、この映画が入っているカテゴリのリストである前提としています。もちろん

public class Movie 
{ 
    private IList<Category> _categories; 
    public IList<Category> FetchCategories() 
    { 
     // you can lazy-load here, use Linq-to-Sql, etc. 
     return _categories; 
    } 
    public void AddCategory(Category c) 
    { 
     _categories.Add(c); 
    } 
} 

あなたドン場合は、ここで値オブジェクト(VO、DDDの概念)としてカテゴリーを扱うことができますそれらにアイデンティティがありません。あなたが他のVOと同様に複数のエンティティと関係を持つ集約ルーツとして扱う、お使いのカテゴリーにアイデンティティを維持したいならば

さて、もっと面白いものです。この場合、サービスのDDDコンセプトを利用して、2つの集約を要求されたモデルに結合して、コントローラに渡したいとします。これにより、カテゴリのロードに関するビジネスルールを作成できます。

public class Movie 
{...} 
public class Category 
{...} 
public class MovieCategory : Movie 
{ 
    private IList<Category> _categories; 
    public IList<Category> Categories 
    { 
     get 
     { 
      return _categories; 
     } 
     internal set 
     { 
      _categories = value; 
     } 
    } 
} 
public class MovieCategoryService 
{ 
    public MovieCategory FetchMovieCategoryByMovieId(int id) 
    { 
     MovieCategory mc = _movieRepository.FetchMovie(id); 
     // do some logic here, some checks, etc 
     // to obtain your Categories list. Maybe querystring? 
     IList<Category> cats = ...; 
     mc.Categories = cats; 

     return mc; 
    } 
} 

コンセプトは、あなたが今、これらの関係の複雑な作成を処理するために、このMovieCategoryServiceでは、ドメイン層内のロジックを持っている、または同様の複合型を作成するために工場を使用していることです。

これは、異なるビューとパーシャルビューに渡すことができるモデルを提供します。

元の投稿の最後の手順は、これをビューに表示する方法です。私はこの問題に対するViewModelのアプローチを試してきました。 ViewModelを動的に、またはクラスとして作成し、このViewModel上のすべてのエンティティをハングする。最近のStackOverflowの質問がこのコンセプトに当たっています。 ViewModel Best Practices

私はビューに直接モデルを通過してきた、と私は今、このアプローチをしようとしています。あなたのDOmainモデルは本当にあなたのページ上の "論理"から切り離されているはずなので、クリーンアップします。このIDに基づいてこのパーシャルビューを作成する必要があります。これは、エンティティの別の方法を意味していると思います」 ViewModelアプローチは、ドメインモデルからロジック/思考を取り除き、ビュー/部分ビューを微調整しているアプリケーション/ UIレイヤに、それが所属する場所に配置します。

1

それによってすべての

まず上で動作する唯一の必要詰め込むがあなたからのカテゴリのリストを返すビューを提供する代わりに、ドメイン全体のエンティティ自体のビューにビューモデルの実体を与えることは素晴らしいアイデアですドメインは、その後、今度はその特定のカテゴリに属する​​動画を表示していました。この

- <Host>/Movies/Comedy 
- <Host>/Movies/Horror 

のようなパラメータなものとして、カテゴリ名をとる作品のビューを構築

関連する問題