9

不久前我问过这个问题,但现在我希望在我的数据库访问层和域层之间实现实际的分离。我还将努力将业务逻辑移入它所属的域并移出控制器脚本。

我正在使用 Zend 框架,它为数据访问层实现了表数据网关和行数据网关模式,但它显然未能真正定义如何构建与数据访问层分离的域层。我考虑过使用域逻辑与数据访问逻辑共存的 Active Record 模式,但我有以下情况至少发生一次,我认为 Active Record 无法处理:

我有一个包含 person_id 和 userType 字段的表“Person”。

每个 userType(admin、buyer、associate、supervisor)都有与之关联的特定业务逻辑,并且所有类型都从 Person 对象继承了一些基本功能。

我不想用仅属于一种用户类型的业务逻辑来膨胀 Row Data Gateway 对象,但我不确定如何构造域层来表示不同类型的用户。例如,我是创建一个包含 PersonGateway 对象的 Person 对象,然后编写将调用传递给网关对象的包装函数,还是编写 Person 对象来扩展 PersonGateway 对象,然后只实现我需要的特定功能?

同样,我通常认为这(部分)是一个工厂问题,我需要一个工厂方法来实例化基于 userType 的正确子类。这仍然是 Zend Framework 的 Zend_Db 类的最佳方法吗?

任何有关如何在 Zend_Db 之上正确创建域模型的建议或教程链接将不胜感激。

4

1 回答 1

17

领域模型不扩展任何东西。它们只是用于封装业务逻辑的普通类。它们可能使用数据访问对象,因此类中可能存在protected行数据网关对象的实例。对象通常Row比对象更接近地表示域的实例Table。此外,您始终可以使用'方法获取Table对象。RowgetTable()

通常 DM 类有一个接口,其中的方法对应于您可以对该类执行的更高级别的操作。但是您不一定要显示所有数据访问操作。

class Person {
  // Zend_Db_Table_Row object
  protected $data; 

  public function subscribeToService(Service $service) { ... }

  public function sendMailTo(Person $recipient) { ... }

  public function changePassword($newPassword) { ... }
}

去年春天我也写了一篇关于这个主题的博客,最近在 ZF 邮件列表上写了一篇关于它的文章。

至于教程和资源,请尝试http://domaindrivendesign.org/

于 2008-12-16T23:02:19.773 回答