25

我很久以前开始了一个项目,并在我的解决方案中创建了一个数据访问层项目,但从未在其中开发过任何东西。数据访问层的目的是什么?有什么好的资源可以让我了解更多关于数据访问层的信息吗?

4

10 回答 10

31

简而言之:松散耦合

将用于从数据存储(数据库、平面文件、Web 服务等)中提取数据的代码与业务逻辑和表示代码分开。这样,如果您必须更改数据存储,您最终不会重写整个事情。

如今,各种 ORM 框架都在将 DAL 与其他层混合在一起。这通常会使开发更容易,但更改数据存储可能会很痛苦。公平地说,像这样更改数据存储是非常少见的。

于 2008-09-12T21:04:49.500 回答
23

数据访问层有两个主要用途

  1. 抽象实际的数据库引擎或其他数据存储,以便您的应用程序可以从使用 Oracle 切换到使用 MS SQL 服务器

  2. 抽象逻辑数据模型,使您的业务层与这些知识分离并且不知道它。使您能够在不影响业务层的情况下修改逻辑数据模型

这里的大多数答案都提供了第一个原因。在我看来,第二个更重要。本质上,您的业务层不应该知道正在使用的逻辑数据模型。今天,使用 ORM 和 Linq #2 似乎已经消失了,人们往往会忘记(或者无法看到确实存在并且应该存在的细线)关于 #2。

本质上,为了更好地理解数据层的目的和功能,您需要从业务层的角度来看待事物,记住业务层应该与数据存储的逻辑数据模型无关。

因此,例如,每次业务层需要数据时,如果应该以一种非常简单的与逻辑数据模型无关的方式来请求它需要的数据。所以它会调用数据访问层,例如:

GetOrdersForCustomer(42)

它准确地返回它需要的数据,而不知道哪些表存储了这些信息或存在关系等。

我在我的博客上写了一篇文章,介绍了更多细节。

数据访问层的目的和功能

于 2010-11-21T09:22:11.023 回答
8

数据访问层遵循“关注点分离”的理念,即业务逻辑与数据层(数据库)交互所需的所有逻辑都被隔离到一组类(层)中。这使您可以更轻松地更改后端物理数据存储技术(例如,从 XML 文件移动到数据库,或从 SQL Server 移动到 Oracle 或 MySQL),而不会对您的商业逻辑。

有很多工具可以帮助您构建数据层。如果您搜索短语“对象关系映射器”或“ORM”,您应该会找到一些更详细的信息。

于 2008-09-12T21:03:13.327 回答
8

当应用程序的许多不同部分需要以相同的方式访问数据时,数据访问层非常有意义。

当您需要以多种不同方式访问相同数据时,这也很有意义。例如,文字处理器如何读取许多不同的文件类型并将它们静默转换为应用程序的内部格式。

请记住,DAL 也可能适得其反。如果您正在构建一个数据访问性能至关重要的系统,那么将其与业务逻辑分开可能会使一些重要的优化变得不可能。

于 2008-09-12T21:11:36.300 回答
7

DAL 应该从项目的其余部分中抽象出您的数据库——基本上,除了 DAL 之外的任何代码中都不应该有任何 SQL,并且只有 DAL 应该知道数据库的结构。

目的主要是为了使您的应用程序的其余部分与数据库更改隔离,并使其更容易扩展和支持您的应用程序,因为您将始终知道去哪里修改数据库交互代码。

于 2008-09-12T21:04:26.957 回答
1

目的是抽象出应用程序的其他部分不需要关心的数据库访问细节。

于 2008-09-12T21:05:41.993 回答
1

数据访问层用于从其表示中抽象出数据的存储和检索。您可以在 1994 年的设计模式中阅读更多关于这种抽象的信息

于 2008-09-12T21:05:52.913 回答
1

目的是从数据使用和操作中抽象出数据存储检索机制。

好处:

  • 底层存储可能会发生变化(例如从 Oracle 切换到 MSSQL),您需要一种方法来本地化这些更改
  • 架构更改 - 见上文
  • 您想要一种与数据库断开连接的运行方式(演示模式):将文件序列化/反序列化添加到 DAL
于 2008-09-12T21:06:50.493 回答
0

我建议您在此处阅读:http: //msdn.microsoft.com/en-us/practices/default.aspx 使用 DAL 将帮助您将数据访问与演示和业务逻辑隔离开来。我经常使用它,以便我可以轻松地换出(通过反射和动态加载程序集)数据提供者。

阅读,那里有很多很好的信息。

此外,如果您打算使用 .NET ,请查看数据访问块。这可能是一个很大的帮助。

于 2008-09-12T21:02:37.430 回答
0

我想我要补充的一个尚未提出的事情是,拥有 DAL 可以提高系统的安全性。例如,数据库和 DAL 可以在公众无法访问的服务器上运行,而业务逻辑可以在面向公众的服务器上运行,这样公共服务器就不能在数据库上运行原始 SQL。如果公共服务器受到损害,这可以帮助减轻很多损害。

于 2018-05-13T23:36:06.997 回答