在 asp.net mvc 中编写查询的正确位置 [关闭]

Posted

技术标签:

【中文标题】在 asp.net mvc 中编写查询的正确位置 [关闭]【英文标题】:The correct place to write queries in asp.net mvc [closed] 【发布时间】:2013-02-25 01:36:45 【问题描述】:

假设我有一个博客,其中包含不同作者的帖子,作者应该能够看到他们写的文章。

现在我使用实体框架的数据库上下文编写查询。

现在的问题是查询应该在控制器或模型类的具体操作方法中去哪里。

我是个新手,这件事让我很困惑。

【问题讨论】:

+1 实际上,这是一个有趣的问题。我发现很多时候人们对这类事情感到困惑。简短的回答是这取决于(您是否执行任何逻辑?),答案几乎总是模型类,但我会等待有人提供解释 asp.net MVC 在这方面的 MVC 概念的答案。跨度> 我同意这是一个好问题。但是这个论坛每周都会被问到。您可以通过搜索 Skinny ControllersSkinny Models 获得大量信息。但最重要的是,这不是讨论的论坛。 SE Programmers 论坛是这个会议的好去处。 正如我所说,我真的是一个菜鸟程序员,对设计模式一无所知。我不是在寻找讨论,而是人们如何做或微软建议如何做。因为包含示例代码,似乎所有内容都进入了控制器操作。 如果模型是 DTO 的一种形式(我相信它是),那么 this 可能会有所帮助。逻辑进入控制器或从控制器编排。这包括查询。 【参考方案1】:

我会将这些类型的查询放入存储库类中;这样您就可以在应用程序的多个部分使用相同的查询。

【讨论】:

【参考方案2】:

这取决于您的应用程序的层。它是 MVC 的事实并不重要。你有数据层吗?如果是这样,它会去那里。

这有点像询问您的查询在 WinForms 应用程序中的位置。同样,如果这是一个不平凡的应用程序,您可能有一个 UI、一个服务层、一个业务逻辑层和一个数据层。数据层是您的查询所在。

在 MVC 应用程序中,控制器知道如何对视图中的事件做出反应。在我工作过的应用程序中,控制器将调用业务逻辑层,然后 BLL 将连接到数据层。这在琐碎的应用程序中会有点过分,但我不确定您的应用程序有多大。

BLL 和 DAL 是您的模型。所以,简短的回答是:

查询属于模型,而不是控制器。

【讨论】:

可以说它只是一个非常简单的琐碎博客。 我认为你真的应该将查询排除在控制器之外,除非它非常微不足道并且没有其他人会使用它。这里有一个很好的答案:***.com/a/7281893/279516【参考方案3】:

控制器应该尽可能精简

因此,放置查询的最佳位置是在控制器操作之外,所有类型的持久性查询通常放置在存储库 (Repository Pattern) 或某些业务逻辑层 - 这实际上取决于应用程序的复杂性。

简而言之,存储库模式实际上是在应用程序中只有一个地方包含持久性知识以及如何查询它,通常我们可以在那里找到CRUD 操作。通常,每个“域上下文”(订单、博客文章……)都有一个存储库。

例如(小应用的工作流程):

OrderController -> OrderRepository -> Persistance
CreateOrderAction -> SaveOrder -> Query

因为。想想看。如果您有OrderController,然后假设是SpecialOrderController,但两者都需要订单数据怎么办?在这种情况下,您最终会遇到查询代码重复,如果是存储库模式的情况,您可以避免这个“陷阱”。如您所知,DRY 原则是我们工艺中最伟大的原则之一。

【讨论】:

以上是关于在 asp.net mvc 中编写查询的正确位置 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

大型查询如何在 C#/ASP.NET MVC 4 部分中返回结果

ASP.NET MVC 分页,保留当前查询参数

在 asp.net-mvc 中,在不影响其他用户的情况下进行昂贵操作的正确方法是啥?

ASP.NET MVC 服务层输入输出数据

ASP.NET MVC 4、EF 和 LINQ:为多对多关系创建特定的 LINQ 查询

在 asp.net-mvc 中从服务器读取文本文件的最佳方法是啥