我一直试图在ASP.NET中找到MVC和3层架构之间的差异。我之前提到了一些先前的问题和一些页面,但可以找到一个明确的答案 这是一个关于MVC实现的msdn页面:http://msdn.microsoft.com/en-us/library/ff647462.aspx
考虑一下,我的代码是这样的:
单页面的aspx用户界面和代码
<%@ 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>
现在,请考虑我有不同的文件
----查看和代码隐藏加密----
的的.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();
}
}
Controller
类的上述msdn page link,我无法辨别业务逻辑(对于3层架构中的中间层而言类似)与控制器。答案 0 :(得分:5)
我实际上对此有一段时间的错误,有关于如何正确实现它的不同哲学,所以这就是我用自己的方式理解我如何理解所涉及的不同事物之间的关系(模型/视图/控制器) /业务逻辑):
Model
实例形式的数据我已经看到了其他方法,其中业务逻辑实际上被放入控制器,但在我看来,它失败了目的。我们没有构建MVC应用程序以获得良好的结构,而且还能够更好地执行单元测试。
回到你的问题,它是如何与ASP.NET 3层架构相关的 可以说基本上整个MVC Web应用程序不再是Presentation层(+使用Busines层连接Presentation层)。
其他图层与表现层保持独立且独立,正如之前应该具有的那样。
答案 1 :(得分:4)
MVC和3层是完全不同的事物 我看到很多人混淆了两者,因为他们都有三个部分。
MVC 是 UI模式:
查看:仅包含html和js(如果是网络项目)
控制器:是UI(=视图)和后端(=模型)之间的一种中介
模型:这是您的域对象所在的位置,以及业务和数据访问逻辑
3层关注应用的整体:
UI :包含html / js以及页面背后的代码
除了UI代码和调用业务层之外,这里绝对有无逻辑
业务层:这是您放置计算,条件,验证等内容的地方
所以你的应用程序的实际行为。这里没有数据访问代码
数据访问:在这里您可以与数据库通信并将数据返回到业务层
没有别的,业务层应该知道如何处理它。
所以如果你合并两个,你会得到:
UI:视图和控制器
业务层:模型的一部分
数据访问:模型的一部分
域对象:您需要将您正在使用的对象(产品,订单,...)放在单独的图层中
这也是该模型的一部分。
如果您有疑问,请拍摄!
答案 2 :(得分:0)
请参阅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