2011-01-23 42 views
1

目前我已经为每个数据模型获得了数据库访问类的存储库类。寻找在asp.net中处理版本库的好习惯mvc

在主页上,我需要显示来自每个存储库的前5条记录。所以在HomeController中,我需要有很多存储库成员,这不正确。有没有什么好的解决方案?

非常感谢您的帮助。欢迎任何建议!

回答

4

你可以使用,这将聚集这五个仓库成单个b服务层有用的操作。示例:

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); 
    } 
} 

并在视图:

@model IEnumerable<AppName.Models.Item> 
<h2>Top items</h2> 
@Html.DisplayForModel() 

它使用项目显示模板(~/Views/Items/DisplayTemplates/Item.cshtml):

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

您可以为基本操作创建一个通用存储库,并在为每个实体部分创建存储库时继承该存储库。

但这种方式你仍然需要5个实例或通用存储库。

所以有2种方式:

1)

创建一个存储库UniRepo

其中有像Get<T>(int id)泛型方法等

,并在您HomeController

使用2)

不要把仓库的任何实例中HomeController,而不是

创建5个控制器每个实体,并在每个你把仓库的一个实例,该列表

,并在创建一个动作家庭/索引视图你做

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

Html.Action相当于

的RenderAction
0

我第二达林季米特洛夫的响应。

根据我的经验,通常(在桌面开发中)有一个服务层,可以与您的存储库进行所有通话。

例如

  1. 视图模型
  2. 服务
  3. Repository1:库2
  4. 数据存取1:数据访问2

然后从顶端你永远只能调用服务(S),其保持一切。