MVC 控制器和业务逻辑之间的区别(3 层)

Posted

技术标签:

【中文标题】MVC 控制器和业务逻辑之间的区别(3 层)【英文标题】:Difference between MVC controller and business logic (3 tier) 【发布时间】:2012-04-02 17:18:18 【问题描述】:

我一直试图找出 MVC 和 ASP.NET 中的 3 层架构之间的区别。我参考了一些以前的一些以前的问题和一些页面,但可以找到一个明确的答案。 这是一个关于 MVC 实现的 msdn 页面:http://msdn.microsoft.com/en-us/library/ff647462.aspx

考虑一下,我有这个代码:单页 aspx UI 和代码也是如此

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<html>
   <head>
      <title>start</title>
      <script language="c#" runat="server">
         void Page_Load(object sender, System.EventArgs e)
         
            String selectCmd = "select * from Recording";

            SqlConnection myConnection = 
               new SqlConnection(
                  "server=(local);database=recordings;Trusted_Connection=yes");
            SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, 
               myConnection);

            DataSet ds = new DataSet();
            myCommand.Fill(ds, "Recording");

            recordingSelect.DataSource = ds;
            recordingSelect.DataTextField = "title";
            recordingSelect.DataValueField = "id";
            recordingSelect.DataBind();
         
       </script>
   </head>
   <body>
         <asp:dropdownlist id="recordingSelect" runat="server" />
         <asp:button runat="server" text="Submit" OnClick="SubmitBtn_Click" />
      </form>
   </body>
</html>

现在,考虑我有不同的文件用于 ---- View 和 Code-behind spearated ----.aspx

<%@ Page language="c#" Codebehind="Solution.aspx.cs" 
   AutoEventWireup="false" Inherits="Solution" %>
<html>
         <asp:dropdownlist id="recordingSelect" runat="server" />
      </form>
   </body>
</html>

.aspx.cs

using System;
using System.Data;
using System.Data.SqlClient;
public class Solution : System.Web.UI.Page

   private void Page_Load(object sender, System.EventArgs e)
   
      if(!IsPostBack)
      
         String selectCmd = "select * from Recording";
         SqlConnection myConnection = 
            new SqlConnection(
               "server=(local);database=recordings;Trusted_Connection=yes");
         SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);
         DataSet ds = new DataSet();
         myCommand.Fill(ds, "Recording");
         recordingSelect.DataSource = ds;
         recordingSelect.DataTextField = "title";
         recordingSelect.DataValueField = "id";
         recordingSelect.DataBind();
      
   
    看到上面 msdn page link 的 Controller 类,我无法辨别业务逻辑(对于 3 层架构中的中间层来说是相似的)和控制器之间的区别。 3 层和 MVC 是完全不同的东西吗? Visual Studio 中的 ASP.NET 应用程序是否已经像 MVC 形式那样分离文件?如果这些没有什么不同,哪一种是首选风格? 如果 .aspx 和 .aspx.cs 已经分开,那么 MVC 框架是什么?

【问题讨论】:

【参考方案1】:

我实际上为此苦苦挣扎了一段时间,关于如何正确实现它有不同的理念,所以这就是我如何用我自己的话理解它如何理解所涉及的不同事物之间的关系(模型/视图/控制器/业务逻辑):

查看次数 拥有所有 Html / jQuery 代码,它们使用来自控制器的Model 实例形式的数据 型号 保存视图需要呈现的信息的类(产品列表等) 控制器 他们接受传入的请求 进行必要的准备(参数提取等)以调用您的实际业务逻辑代码。 然后调用业务逻辑代码并检索结果 然后他们获取结果并将其转换为 UI 可以理解的模型 业务逻辑 这是您的实际业务逻辑代码,调用数据库等。我认为这与整个 MVC 事物完全分开,实际上它甚至不应该知道它是从 MVC Web 应用程序执行的。通常我们将它放在不同的程序集(类库)中,以确保根本不依赖 MVC 代码。 这使得仅对业务逻辑进行单元测试变得非常简单,因为对 MVC 没有依赖关系。

我见过其他将业务逻辑实际放入控制器的方法,但在我看来,这违背了目的。我们构建 MVC 应用程序不是为了有一个好的结构,也不是为了更好地执行单元测试。

回到您的问题,这与 ASP.NET 3 层架构有何关系。可以说,基本上整个 MVC Web 应用程序只不过是表示层(+ 连接表示层与业务层)。

其他层与表示层保持分离和独立,就像它们以前应该有的那样。

【讨论】:

这完全正确。我还要说视图包含表示逻辑,而控制器包含表示层中的应用程序逻辑。此外,模型通常是业务层的一部分。 @BalazsTihanyi 实际上,我们没有让业务层知道视图使用的模型,业务层正在使用一组不同的“模型”,结果映射到模型在控制器内(自动映射器我在看着你)【参考方案2】:

MVC 和 3 层是完全不同的东西。 我看到很多人混淆了这两者,因为两者都有 3 个部分。

MVC 是一种UI 模式视图:仅包含 html 和 js(如果是 Web 项目)控制器:是 UI(= 视图)和后端(= 模型)之间的一种中介模型:这是您的领域对象,以及业务和数据访问逻辑

3-tier 涉及到整个应用程序UI:包含html/ js 以及页面背后的代码。 除了 UI 代码和调用业务层之外,这里绝对没有逻辑业务层:这是您放置计算、条件、验证等内容的地方, .. 所以你的应用程序的实际行为。这里没有数据访问代码。数据访问:在这里您与数据库对话并将数据返回给业务层。没有别的,业务层应该知道如何处理它。

因此,如果您将两者结合,您将获得: UI:视图和控制器 业务层:模型的一部分 数据访问:模型的一部分 领域对象:您需要将正在使用的对象(产品、订单等)放在单独的层中。 这也是模型的一部分。

有问题就拍!

【讨论】:

【参考方案3】:

请参阅here,了解软件架构/设计中“层”和“层”之间的良好比较

MVC 模式完全是关于关注点分离,并且表示层(视图)和业务逻辑应该分离。使用后面的代码很容易使事情变得混乱。您会发现新的 ASP.NET 视图引擎 (Razor) 甚至没有代码隐藏文件。

当你想自动测试控制器中的逻辑时,主要区别将开始变得更重要,控制器只是一个普通的旧类,但你的代码隐藏继承自 System.Web.UI.Page,因此与 ASP.net 的内部结构紧密相关。

另外,阅读 http://ardalis.com/Codebehind-Files-in-ASP.NET-MVC-are-Evil 和 https://msmvps.com/blogs/luisabreu/archive/2008/09/19/codebehind-files-in-asp-net-mvc-are-not-evil.aspx

【讨论】:

我之前读过这个。在我看来,唯一的区别是 M & V 可以直接与 Controller 交互(在 MVC 中),另一方面,在 3 层架构中,通信必须通过业务逻辑完成。看起来像两种不同的方法,具有细微的可感知差异。在 MVC 或 3 层之间进行选择有优势吗? 我会说 3 层和 MVC 是非常不同的概念(因为现在使用 MVC 模式),3 层更多地是指将您的数据访问在逻辑上(通常是物理上)与您的业务逻辑分开,所以在今天的术语中,MVC 成为您应用程序的前两层,但您仍然有一个位于其后面的数据访问“层” 这个问题还涉及 MVC 与 3 层 ***.com/questions/1025430/… @Rich 我认为整个 MVC 应用程序应该被视为表示层(+ 将控制器连接到业务层)。业务层应该在某个完全独立的地方,最好把它放在一个单独的程序集中。如果你做对了,它甚至不知道它是在 Web 应用程序中运行的,也不知道关于 MVC 程序集的任何事情 @ntziolis 没有一个正确答案,但我同意***.com/questions/235233/… 并相信至少一些业务逻辑属于模型

以上是关于MVC 控制器和业务逻辑之间的区别(3 层)的主要内容,如果未能解决你的问题,请参考以下文章

Java Web 开发时的 MVC 模型和软件的3层架构(表现层,业务逻辑层,数据访问层)都有哪些区别和联系?

asp.net中的三层架构是啥意思?mvc设计模式是啥?它们之间有关系吗?

三层架构和mvc模式有啥关系

mvc mvp mvvm的区别

iOS中的MVC和MVVM

如果我从控制器中取出逻辑,是不是需要业务逻辑层?