为什么不';不要在视图中使用存储库

本文关键字:存储 视图 为什么不 | 更新日期: 2023-09-27 18:21:48

我有一个局部视图,它循环通过它的Model(事物列表)来显示事物。名称和三个作为相关实体计数的整数值。

首先,我试着放:(伪剃须刀)

foreach(thing in Model){
    @thing.Name : 
        @thing.related.entities.where(condition1).Count()
        @thing.related.entities.where(condition2).Count()
        @thing.related.entities.where(condition3).Count()
}

但它真的很慢。。。因此,我在ThingRepository中创建了一个函数,它可以更快地执行相同的查询,类似于以下(伪代码)

function GetCountofRelatedEntities(relatedID,condition){
    return db.entities.where(relatedID==relatedID && condition).count()
}

而且它要快得多,所以我想调用它。我想我应该从控制器调用它,但我需要一个ViewModel来保持一个(thing,int,int,int)集合作为模型,或者我可以非常使用ViewBag将结果传递给视图,但是,问题是:为什么不简单地从视图中使用存储库呢?视图中的此代码有什么问题?(伪剃须刀)

@repo=new ThingRepository()
foreach(thing in Model){
    @thing.Name : 
        @repo.GetCountofRelatedEntities(thing.relatedID,condition1)
        @repo.GetCountofRelatedEntities(thing.relatedID,condition1)
        @repo.GetCountofRelatedEntities(thing.relatedID,condition1)
}

你能告诉我为什么我不应该在视图中实例化存储库吗?或者我能做到?

为什么不';不要在视图中使用存储库

为什么不简单地从视图中使用存储库呢?

因为你违反了MVC设计模式。视图的职责不是获取数据。它以视图模型的形式显示从控制器传递给它的数据。就这么简单。

你可以在视图中调用存储库或任何你喜欢的东西,但不要再用asp.net-mvc标记你的问题,因为你不再做任何mvc了。我的意思是,你可以做任何你喜欢的事情——如果你愿意,你甚至可以在你的视图中编写SQL查询。

但是MVC设计模式的全部意义在于将数据检索逻辑与表示逻辑分离。

MVC模式的一个目的是提供一种适合各种常见编程情况的结构。简化:

  • 模型:描述应用程序的形状,即特定于业务的软件部分
  • 查看:向用户显示数据,并将用户事件传输到服务器
  • 控制器:充当视图和模型之间的中间人

你的建议"有效",因为它可以将数据放在你想要的页面上。从短期来看,它似乎节省了你的时间和精力,因为你不必麻烦控制器、查看包等。

然而,你打破了MVC结构,以后可能会后悔。例如,几周后,你的老板来找你,说:"嘿,你知道你添加的那个页面是为了显示实体列表吗?我们需要对它进行一些过滤和排序。我昨天就需要它。"

现在你面临一个选择:我是将这个过滤逻辑添加到我的视图页面并在截止日期前完成,还是花时间将数据访问代码移动到控制器并重新修改我的视图,冒着错过截止日期并破坏现有功能的风险?

你可能会采取简单的方法,将逻辑添加到视图中,现在你手头上的麻烦越来越大。我们已经开发了VB6和Webforms应用程序,其中包含6000行代码隐藏文件。相信我,你不想去那里。

另一个问题是MVC结构被编程社区很好地理解。如果其他人出现并试图处理你的代码,你偏离了传统的方法,这会让他们更难处理。

MVC结构经过了时间的考验并且是合理的。在你完全理解它的目的和它提供的好处之前,试着密切关注它。在你牢牢掌握规则之前,打破规则不是一个好主意。

我的主要反对意见是分离关注点。一旦你开始从你的视图中访问数据库,你的"视图"就不再只是一个视图了。在数据访问和视图之间进行干净的分离非常方便。

为什么这种关注点分离很重要?它使使用由这些干净的分离组成的系统更容易。当您需要调整检索的数据时,您永远不需要对视图大惊小怪。只要视图得到正确的值,它就会正确地显示它。同样,如果您想更改值的显示方式,您可以修改视图,而不会有任何查询数据的机会。

问题是View中不应该有任何逻辑,因为这不是MVC方法。

MVC是CCD_ 3。

因此,您应该创建ViewModel,其中包含视图所需的ALL数据。