7

我正在实现一个数据访问层 (DAL),它基本上是一组具有 (VB.NET) 共享函数的类,用于实际执行数据库 (CRUD) 调用。我试图找出在类层次结构中调用 DAL 的最佳位置。让我举个例子吧。

假设我有一个类 Customer,它只有标准 ID、Name、Address1 等属性,可能还有一个被覆盖的 ToString 函数左右。我还有一个带有共享方法的 DAL 类,例如:

(pseudocode)

Namespace Dal

Public Class Customer

Public Shared Function Read(id As Integer) As Customer

Public Shared Function ReadList() As List(Of Customer)

Public Shared Sub Create(c As Customer)

'etc.

现在,我可以像这样从表示层调用 Dal:

Me.DataGridView1.Datasource = Dal.Customer.ReadList

但是,让表示层完全了解 Dal 不是一个好习惯吗?我应该像这样将方法放在客户对象中并调用 Dal 吗?

Public Function ReadList() As List(Of Customer)
    Return Dal.Customer.ReadList()
End Sub

Public Sub Create()
    Dal.Customer.Create(Me)
End Sub

这会是“更清洁”的 OOP 吗?或者让演示文稿调用 Dal 并像我之前的示例一样传递业务对象是否可以接受:

Me.DataGridView1.Datasource = Dal.Customer.ReadList

Dim c As New Customer
c.Name = "Alpha Corporation"
c.Address1 = "123 Main Street"
Dal.Customer.Create(c)

感谢您的反馈意见。

4

3 回答 3

5

您的应用程序对您的 DAL 了解得越少越好。有几种方法可以做到这一点,我认为你在正确的轨道上。我认为您可能希望研究此实现的工厂模式,因为您将能够将 DAL 实现隐藏在工厂后面并从工厂返回实体和实体集合。

于 2009-02-20T19:48:58.310 回答
3

我同意数据调用不属于 UI 层。这些仅用于演示。

我认为它们适当地属于服务层。服务实现使用模型对象和持久层来实现其目标。无论是基于 XML 的 Web 服务还是本地接口,服务都是映射到用例并了解工作单元的对象。

要么将数据库调用放入单独的持久层,要么将它们嵌入模型对象中以获得额外的面向对象的纯度。

于 2009-02-20T19:50:07.933 回答
2

您之所以要将 CRUD 操作拉入一个单独的层,是为了以防万一您想要更改数据库系统。嗯,这就是我这样做的原因。我不建议这样做只是为了做好 OOD。但是给你...

几组类/接口

BusinessObject - 表示诸如客户之类的业务类型实体,具有 DataManager 作为属性。

DataManager - 也许你可以想出一个更好的名字,但是这个东西为 BusinessObjects 提供了 Load() 和 Save() 函数

SearchList - 返回事物列表,您的 SQL 查询在这里。这也应该表现得像带有 Next()、Eof() 和 CurrentRecord 类型成员的 RecordSet

构造函数/工厂 - 请参阅 FactoryPattern。您已经将数据库操作与业务对象分离,这会以必要的方式重新耦合它们。为 BusinessObject 分配适当的数据管理器实现

想出你想要的任何实际名称,但让我们再谈谈客户。假设您有一个 Oracle 数据库。你最终可能会得到这些类:

继承自 BusinessObject 的 boCustomer

oracleDMCustomer 继承或实现 DataManager

继承自 searchlist 的 searchlistCustomer 已通过抽象方法或作为接口公开,例如:

  • SearchAll() - 应该返回所有客户
  • SearchByZip(String zip) 应该返回给定邮政编码的所有客户

oracleSearchlistCustomer - 实现 searchlistCustomer,实际上将实现 SearchAll() 和 SearchByZip()

boFactory - 具有类似于 CreateObject(Type type) 的方法的静态类

searchlistFactory - 具有类似于 CreateSearchList(Type type) 的方法的静态类;

我会让你填补一些空白,但我认为重要的东西在那里。其他人可能有不同的想法,需要较少的抽象。在使用一种策略之前,我会模拟几种策略。

于 2009-02-20T20:03:25.903 回答