2011-01-23 6 views
1

現在、私はデータアクセスのための各データモデルのためのリポジトリクラスを持っています。asp.net mvcのリポジトリを扱うための良い練習を探しています

ホームページでは、各リポジトリからトップ5のレコードを表示する必要があります。だからHomeControllerでは、多くのリポジトリメンバーが必要になりますが、それは正しいとは感じません。これには良い解決策はありますか?

ありがとうございました。どんなアドバイスも大歓迎!

答えて

4

と同等です

@Html.Action("list","entity1"); 
@Html.Action("list","entity2"); 
@Html.Action("list","entity3"); 

あなたが家/ indexビューusiness操作。例:

public interface IItemsService 
{ 
    IEnumerable<Item> GetTopItems(); 
} 

この実装では、必要に応じて多くのリポジトリを使用します。今すぐあなたのコントローラは、単純に次のようになります。

public class ItemsController : Controller 
{ 
    private readonly IItemsService _itemsService; 
    public ItemsController(IItemsService itemsService) 
    { 
     _itemsService = itemsService; 
    } 

    public ActionResult Index() 
    { 
     var topItems = _itemsService.GetTopItems(); 
     return View(topItems); 
    } 
} 

とビューで:

アイテム表示テンプレート( ~/Views/Items/DisplayTemplates/Item.cshtml)を使用しています
@model IEnumerable<AppName.Models.Item> 
<h2>Top items</h2> 
@Html.DisplayForModel() 

@model AppName.Models.Item 
<div>@Model.Title</div> 
1

基本操作用の汎用リポジトリを作成し、各エンティティのリポジトリを部分的に作成するときにそのリポジトリを継承することができます。

しかし、この方法では、依然として5つのインスタンスまたは汎用リポジトリが必要になります。

1)

などGet<T>(int id)のような一般的なメソッドを持っているリポジトリUniRepo

を作成し、HomeController

でそれを使用します。

ので2つの方法があります

2)

は、各エンティティの5つのコントローラを作成し、それぞれにリポジトリのインスタンスを入れて、そのリスト

とでのアクションを作成する代わりに

HomeControllerにリポジトリの任意のインスタンスを入れていませんHtml.Actionあなたは、単一のBにそれらの5つのリポジトリを集約するサービス層を使用することができRenderAction

0

私は二ダーリンディミトロフの応答。

私の経験では、デスクトップ開発ではリポジトリと話すすべてのことをするサービス層を持つのが普通です。

  1. ビューモデル
  2. サービス
  3. Repository1:[データアクセス2

上端から、あなたが唯一のこれまで(s)はあなたのサービスを呼び出す:リポジトリ2

  • データアクセス1物事を怠惰に保ちます。

  • 関連する問題