Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 我的DAL应该返回Person还是Datatable?_C#_.net_Design Patterns_Data Access Layer - Fatal编程技术网

C# 我的DAL应该返回Person还是Datatable?

C# 我的DAL应该返回Person还是Datatable?,c#,.net,design-patterns,data-access-layer,C#,.net,Design Patterns,Data Access Layer,读完后,我还有一个问题: 我使用以下代码查询数据库: c#: BLL: 达尔: 但是我做错了吗? 我的DAL是否应该返回数据表?(那么BLL将创建Person…?) 达尔: 多谢各位 编辑: Person对象是在BEdll(业务实体)中定义的。您的DAL,确切地说是存储库,返回在BLL中定义的业务对象Person BLL不应该依赖于DAL,最多它定义了一些将在DAL中实现的接口。但是,应用程序要求DAL提供存储的业务对象,因为它负责处理所有持久性问题 是的,DAL取决于BLL。DAL sohld

读完后,我还有一个问题:

我使用以下代码查询数据库:

c#:

BLL:

达尔:

但是我做错了吗?

我的DAL是否应该返回数据表?(那么BLL将创建Person…?)

达尔:

多谢各位

编辑:


Person对象是在BEdll(业务实体)中定义的。

您的DAL,确切地说是存储库,返回在BLL中定义的业务对象Person

BLL不应该依赖于DAL,最多它定义了一些将在DAL中实现的接口。但是,应用程序要求DAL提供存储的业务对象,因为它负责处理所有持久性问题

是的,DAL取决于BLL。DAL sohld只返回应用程序对象(业务对象或视图模型),所有与持久性访问相关的内容都应该隐藏

“我的DAL应该返回DataTable吗?(因此BLL将创建Person…?)

一点也不。理想情况下,DAL应该处理数据库,并且应该将实体/应用程序对象返回给BAL。DAL作为数据库到BLL的抽象


我同意MikeSW所说的“BLL不应该依赖DAL,最多它定义了一些将在DAL中实现的接口。”

在BLL中返回您需要的任何内容。你的DAL知道人吗?@TimSchmelter嗨Tim,但是,我想知道引用我的DAL(实体)是不是一件坏事,因为BLL已经引用了它…@TimSchmelter是的,它有一个引用。(实体)就我个人而言,如果我看到在没有很好的理由的情况下使用
数据表
(主要是:如果模式完全不可预测)但是:这里没有一个单一的答案。只有观点。这有点主观。这取决于你实际需要什么以及你的类库有多公开。你是在多个项目中使用它,还是在这个项目中使用它?填充一个数据表,返回它,然后将它转换成一个
List
是昂贵且冗余的。因此,如果
Person
是一个已知类(或者您的DAL仅用于此项目),您应该返回该类。1)Person对象在BE中定义,而不是在BLL中定义。(编辑)@MikeSW我当时的印象是DAL应该对BLL一无所知,而BLL应该只知道DAL的界面。但是,他们都应该知道共享对象定义(例如本例中的Person)。我错了吗?这取决于应用程序的大小。在最高级别上,是的,您将有一个只包含接口的公共层,然后BL和DAL将实现它们,并且没有人会知道彼此,但是如果您实际上不需要的话,这有点过度设计了。DAL为什么要引用它们?BLL从DAL的datatable中创建Person有什么不对?创建层需要了解一些基本概念。不同的层用于分配应用程序的职责。万一。。。BLL正在从DLL中获取数据表…过了一段时间,如果数据库发生更改…您需要同时更改DLL和BLL中的逻辑…这不太好…否则只需更改DLL即可。这只是it BLL只应该获取实体/应用程序对象的一个例子。还有更多的事情,如可维护性、清晰的工作流程设计、以最小的工作量和副作用进行更改等。PraveenPrajapati+@mike你能去吗
new BLL().GetPersonById(1)
public Person GetPersonById(int id)
{
  return new DAL ().GetPersonById(1);
}
public Person  GetPersonById(int id)
{
   // goto db and create instance of Person and fill its data...
}
public DataTable  GetPersonById(int id)
{
   // goto db ...
}