0

根据这篇文章here

您可以将它们 [Services] 视为“更高级别的域对象”,但服务不是业务逻辑,而是负责域对象和映射器之间的交互。这些结构最终创建了一个用于与域业务逻辑交互的“公共”接口。您可以避免它们,但代价是会将一些域逻辑泄漏到控制器中。

我一直在阅读 MVC,并将 M 部分拆分为服务、域对象和数据映射器。服务和数据映射器很容易弄清楚,但我不明白域对象的原因,你能给我一些例子吗?这是我的代码:

会员服务

class MemberService extends Service
{
    public function authenticate()
    {
        $domainObject = $this->domainObjectFactory->getDomainObject('Member');
        $dataMapper = $this->databaseFactory->getMapper('Member');  

        $_temp_sess_id = 0;
        $_temp_sess_password = "";

        $member = $dataMapper->fetch( $_temp_sess_id );
        $authenticationResult = $domainObject->checkPassword( $member['password'], $_temp_sess_password );

        if (!$authenticationResult)
        {
            $member = ['user_id' => 0];
        }

        return $member;
    }
}

成员域对象

class MemberDomainObject extends DomainObject
{
    public function checkPassword( $dataMapperPassword, $locallyStoredPassword )
    {
        if ( $dataMapperPassword !== $locallyStoredPassword )
            return false;
        return true;
    }
}     

更新:

这个问题是关于方法 checkPassword 以及为什么有必要创建一个单独的对象只是为了使用可以在服务内部使用的 IF 语句,从而节省 RAM 使用额外资源来创建新对象。

4

1 回答 1

0

您刚刚通过示例中的某个工厂创建了 MemberDomainObject。为此目的,您显示的代码没有或为零的信息价值。

你需要制作一个真正的应用程序,其中至少包含很少的对象、服务和两个域,所以任何人都可以说“你很好地使用了域对象”。

你不只对“模型对象”感兴趣吗?如果您需要确定正确的“服务>工厂>模型对象>映射器”关系使用,则无需谈论域对象。


通过工厂创建对象是一种很好的做法,因为您可以在重构期间在一个地方更改或添加构造函数调用。

一个建议是:在您的工厂中使用带有命名空间 (FQN) 的类名,它可以帮助您浏览代码和重构

$member = $this->domainObjectFactory->getDomainObject(MemberDomainObject::class); //in php5.5+

你可以用

class DomainObject
{

   static function className(){
      return get_called_class();
   }
}

$member = $this->domainObjectFactory->getDomainObject(MemberDomainObject::className());

在 php <= 5.4 中并在升级时替换它。

一样的

$member = $this->domainObjectFactory->getMember();

不是问题,因为您可以在 ::getMember() 中指定返回类型

于 2016-01-05T21:07:06.310 回答