Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们可以将数据表从业务层传递到表示层吗?_C#_Asp.net - Fatal编程技术网

C# 我们可以将数据表从业务层传递到表示层吗?

C# 我们可以将数据表从业务层传递到表示层吗?,c#,asp.net,C#,Asp.net,我正在做一个三层架构的项目,我需要问一下,如果数据表来自数据层,我们是否可以将它直接传递到表示层,这是一个好的做法?在Cs页面中 public DataTable dtDistinctFRU; dtDistinctFRU= dsData.Tables[0]; 在aspx页面中 <% foreach (System.Data.DataRow row in dtDistinctFRU.Rows) { %> ....some html ... <% Response

我正在做一个三层架构的项目,我需要问一下,如果数据表来自数据层,我们是否可以将它直接传递到表示层,这是一个好的做法?

在Cs页面中

public DataTable dtDistinctFRU;
dtDistinctFRU= dsData.Tables[0];
在aspx页面中

 <% foreach (System.Data.DataRow row in dtDistinctFRU.Rows)
     {
 %>
....some html ...

<% Response.Write(rowNum); %>

…一些html。。。

是的,你可以,但这根本不是一个好的做法。最好为数据库中的每个数据表都有一个实体类。每个类都有类似于DB列的公共属性。所有这些都应该位于您的业务层之下。在数据访问层,以数据表的形式从数据库获取数据,传递到业务层,并将该表转换为实体对象的集合,然后传递到表示层

我觉得你的问题很有争议

在这种情况下,考虑以下几点作出决定:

  • 如果数据库提供程序是您使用ADO.NET或Entity Framework或任何其他ORM自定义实现的,则更改为POCO类并传递这些POCO实例,而不使用DataTable
  • 如果您的结果不是固定的,您可以使用DataTable创建POCO类
  • 查看一篇关于在三层架构中使用DataTable的老文章


    更多信息,请在线阅读使用POCO和DataTable的好处。

    我从来没有这样做过,因为如果通过相同的对象,为什么首先需要这些不同的层?无论如何,因为这是一个建筑问题,所以没有正确的答案,只有观点

    我的观点是:我喜欢业务运营,清楚地表明你对他们的期望,而不是CRUD运营。您只传递完成业务操作所需的内容,而在查询的情况下,您只返回UI真正需要的内容。这意味着您需要设计特定的数据协定,而不是通用数据表。这意味着数据层使用数据实体并将其映射到域实体(例如,首先使用EF代码)。然后将这些域实体映射到服务的数据传输对象;您在UI中使用的


    你可以在上读这个系列来获得一些灵感(特别是第2部分)。

    你可以,但为什么?业务层应该从数据层获取(或多或少)原始数据,并对其应用所需的业务逻辑,并将转换后的数据传递给表示层(IMO)。否则,业务层只不过是一个传递层,而您的3层就变成了2层。您是否研究过这个主题?使用ADO.NET或Entity Framework或其他工具实现的数据库层是什么?如果您想将DataTable直接传递到表示层,这意味着您绕过了业务逻辑层,简而言之,您违反了三层体系结构:)