【问题标题】:OOP - Where to put the calls to the Data Access Layer?OOP - 在哪里调用数据访问层?
【发布时间】:2009-02-20 19:36:29
【问题描述】:

我正在实现一个数据访问层 (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 不是一个好习惯吗?我应该像这样将方法放在 Customer 对象中并调用 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)

感谢您的反馈。

【问题讨论】:

    标签: vb.net oop theory


    【解决方案1】:

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

    【讨论】:

    • 那么,工厂将位于 DAL 和表示层之间,表示层调用工厂中的方法?这和duffymo引用的服务层一样吗?
    • 有点——工厂模式只是一种模式——如果你愿意,它可以以服务层的形式实现。
    【解决方案2】:

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

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

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

    【讨论】:

    • 三位受访者都给出了很好的答案,但我必须选择一个正确的。谢谢大家!
    【解决方案3】:

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

    几组类/接口

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

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

    SearchList - 返回事物的列表,您的 SQL 查询在这里。此外,它的行为可能类似于具有 Next()、Eof() 和 CurrentRecord 类型成员的 RecordSet

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

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

    boCustomer 继承自 BusinessObject

    继承或实现DataManager的oracleDMCustomer

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 2016-08-13
      • 1970-01-01
      • 2011-06-02
      • 2015-09-16
      • 2019-02-08
      • 2010-12-14
      • 2014-08-28
      • 2017-01-01
      相关资源
      最近更新 更多