1

好的,所以我调用了我的 DomainObject/Model$user和我的$userDAO对象。

从我目前所读的内容来看,当我需要执行 CRUD 操作(例如获取$user我刚刚执行的对象)时:

$user = $userDAO->fetchById($userId);

这将返回我的$user对象​​。

显然 DomainObject 不应该知道 DAO 对象存在,反之亦然,但是如果用户正在注册并且我运行该$user->register()方法怎么办

$user->register($firstName, $lastName, $emailAddress, $username, $password etc.);

在该方法的某个地方,我需要检查所选用户名是否已被使用,并且与电子邮件地址相同。

我能想到的唯一方法是$userDAO在我的对象中有一个对象的实例,$user然后进行如下验证:

if($this->userDAO->isUsernameTaken($username)) {
    // the username is already in use
}
else {
    // continue on
}

但这会打破 DomainObject 不应该知道数据库内容的规则,反之亦然,但我认为 DomainObject 并不真正了解数据库内容,因为所有查询都在 DAO 对象中,它只包含对一个对象,但它不明确知道该对象中发生了什么。我是对还是错?

如果我做错了,我应该如何运行一个方法,比如$user->register()需要在其中调用一些需要访问数据源的数据库查询,但是不允许 DomainObject/Model 知道任何数据源,所以专家说?

我今天在谷歌上找到了页码,我以为我永远不必继续,但我仍然找不到任何非常可靠的现实生活例子,我开始发疯,因为它减慢了一切.

任何帮助,将不胜感激。谢谢。

4

1 回答 1

3

如果您从分层架构的角度考虑应用程序的架构,则需要在 Domain Layer 和 DAO 层之上再构建一层,让这两层保持原样。这个新层被一些人称为服务层或应用层。该服务层的工作是执行用例,例如“注册”一个新用户。例如,服务层中的一个类可能是 UserService,它执行与用户相关的用例,

class UserService {

private UserDao userDao;

// constructor
userSercie(){

}

// registers a user
register($firstName, $lastName, $emailAddress, $username, $password etc.) {
    $user = $userDAO->fetchByName($username);
    if($user != null) {
         // the username is already in use
    }
    else {
       // continue on
    }

   }

 // other service methods such as


}

为什么我们需要服务层?正是为了应对像您这样的问题,我们需要服务层。这样你可以看到我们可以保持不同模块之间的关注点分离。

于 2013-01-02T17:24:28.773 回答