寻找在asp.net mvc中处理存储库的良好实践

时间:2011-01-23 07:44:49

标签: asp.net-mvc asp.net-mvc-3

目前,我已经为每个数据访问数据模型获得了存储库类。

在主页中,我需要显示每个存储库的前5条记录。所以在HomeController中,我需要有很多存储库成员,这感觉不对。对此有什么好的解决方案吗?

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

3 个答案:

答案 0 :(得分:4)

您可以使用服务层将这五个存储库聚合到一个业务操作中。例如:

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 :(得分:1)

您可以为基本操作执行通用存储库,并在为每个实体创建存储库时继承它。

但是这样你仍然需要5个实例或通用存储库。

所以有两种方式:

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

答案 2 :(得分:0)

我是Darin Dimitrov的回应。

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

e.g。

  1. 查看模型
  2. 服务
  3. Repository1:Repository 2
  4. 数据访问1:数据访问2
  5. 然后从高端你唯一一次打电话给你的服务,让事情变得神秘。