根据这篇文章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语句,而不是使用额外的资源来创建新对象。
答案 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()
中指定返回类型