定义数据访问层

Posted

技术标签:

【中文标题】定义数据访问层【英文标题】:Define data access layer 【发布时间】:2010-09-21 21:49:40 【问题描述】:

似乎每个人都知道您应该明确区分 GUI、业务逻辑和数据访问。我最近与一位吹嘘始终拥有干净的数据访问层的程序员交谈。我查看了这段代码,结果发现他的数据访问层只是一个包含一些 SQL 方法(如 ExecuteNonQuery 和 ExecuteReader)的小类。事实证明,在他的页面背后的 ASP.NET 代码中,他有大量的 SQL 硬编码到 page_load 和其他事件中。但他发誓他正在使用数据访问层。

所以,我抛出这个问题。您将如何?

【问题讨论】:

访问数据库和拥有数据访问层是不一样的。也就是说,需要使用某种形式的数据访问层来访问数据库,所以我可以理解混乱 【参考方案1】:

我很想分享这个数据检索器(只读)层的设计。

架构的关键:

这个想法是创建一个几乎是单例的对象(如下所述),该对象用于保存使用 get 方法检索的数据 - 下面我将其称为 DRO (DataRetrieverObject)。 客户端对象应该很容易到达DRO。 应该很容易维护类。

结构基于三步构造。

    使用具有(重载)静态方法的DataRetrieverFactory,每个表对应一个您需要的方法。使用重载来匹配不同类型的键。该方法将返回一个 DRO。

    DataRetrieverFactory 将构造作业委托给将创建实际 DRO 的第二类 <TableNameAndKey>DR

    <TableNameAndKey>DR 中,我们有一个指向 DRO 的静态指针列表,循环该列表以查看您是否已经拥有具有特定键的 DRO。

    3.1。如果您找到 DRO - 检查它是否正常(意思是:

    它不应该是“旧的”, 它应该属于会话运行, 等)

    3.1.1。如果 DRO 正常,则返回 DRO。

    3.1.2。如果 DRO 不正常,则删除对象(及其指针)并使用数据库中的数据创建一个新的 DRO。将指针存储在列表中。

    3.2。如果指针列表中没有命中,那么我们使用数据库中的数据创建一个新的 DRO,并将指针存储到静态列表中。

使用这种技术,可以根据需要重用 DRO,但是该类不是单例的,因为我们可以拥有该类的大量实例。

【讨论】:

查看数据访问对象以了解行业标准方法。【参考方案2】:

我发现这篇关于创建 DAL 的文章:

http://www.simple-talk.com/dotnet/.net-framework/.net-application-architecture-the-data-access-layer/

【讨论】:

【参考方案3】:

数据访问层访问数据,仅此而已

【讨论】:

【参考方案4】:

.NET 的一个非常简单的示例如下。

如果有两个类: SomePage(这是一个 ASP.NET 页面) 和 DataService(这是一个普通的旧 C# 类)

如果 SomePage 总是调用 DataService 来读/写数据,那么你有一个数据访问层。 SomePage 将不包含 SQL 或对 System.Data.SqlClient 类的引用。

但 SomePage 可以使用从 DataService 类传入和传给的 DataSet 或业务对象。

【讨论】:

【参考方案5】:

除了其他人所说的之外,我通常认为它是抽象出数据存储方式的地方。一个非常好的数据访问层应该允许您交换 Oracle、SQL Server、Access、纯文本文件、XML 或任何您想要的东西,并且这样做对其他应用程序层是透明的。换句话说,数据访问层和其他层之间的契约应该以与数据库无关的方式定义。

【讨论】:

【参考方案6】:

大多数人认为您的同事所说的不是 DAL。 DAL 应该封装对数据库的任何调用,无论是通过动态 SQL、存储过程还是使用 IRepository 之类的 ORM 完成的。您的网页永远不应包含 SQL 或业务逻辑,否则它会成为维护的噩梦。

【讨论】:

+1 对于大部分内容。然而,动态 SQL 通常表明访问层设计不佳。【参考方案7】:

我个人将 DAL 定义为我的应用程序和数据库之间存在交互的地方。所以我可能有一个与 DAL 交互以允许 CRUD 操作的业务层。

例如,我可能有一个 ModelClass.LoadAll() 方法可以与 DAL 交互,该方法将获取数据,而 ModelClass 将以任何需要的方式使用该数据。

我更喜欢让 DAL 尽可能轻,但其他一些人更喜欢在 DAL 中填充模型数据的另一种方式。

【讨论】:

对我来说,DAL 只是一个执行我的 CRUD 并仅连接到数据库的地方【参考方案8】:

保存数据的“黑匣子”。如果它是用户关心/可以告诉那里有一个数据库(除了每个考虑),这不是我想要的

【讨论】:

以上是关于定义数据访问层的主要内容,如果未能解决你的问题,请参考以下文章

业务层设计——如何定义规则

一个数据访问层服务于多个业务层?或不?

PDO:: 数据访问抽象层 ? :

三层架构的拙见

MVC中数据访问层和模型的区别

PDO抽象层访问