我正确使用域对象吗?

时间:2016-01-05 20:01:26

标签: php service domain-object

根据这篇文章here

  

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

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

MemberService

my $btn = $ff->find_element_by_xpath('//*[@id="Pages_DiagnosticsForceout_btnForceout"]/span/button');

my $forceOutButton = wait_until( $btn->click() );

MemberDomainObject

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;
    }
}

更新:

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

1 个答案:

答案 0 :(得分:0)

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

你至少需要制作一个包含少量对象,服务和两个域的真实应用,所以任何人都可以说“你正在使用域名对象”。

您是否对“模型对象”感兴趣?如果您需要确定使用正确的“service> factory> model object> mapper”关系,则无需谈论域对象。

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

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

WITH

你可以用

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

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

相同
class DomainObject
{

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

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

不是问题,因为您可以在:: getMember()

中指定返回类型