目前,我已经为每个数据访问数据模型获得了存储库类。
在主页中,我需要显示每个存储库的前5条记录。所以在HomeController中,我需要有很多存储库成员,这感觉不对。对此有什么好的解决方案吗?
非常感谢你的帮助。欢迎任何建议!
答案 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。
然后从高端你唯一一次打电话给你的服务,让事情变得神秘。