PHP 面向对象 : Avoid Singleton/Static Methods in Domain Model Pattern

标签 php oop model singleton dns

我了解依赖注入(inject)的重要性及其在单元测试中的作用,这就是为什么以下问题让我犹豫不决:

我努力不使用 Singleton 的一个领域是身份映射/工作单元模式(它在域对象状态上保持标签)。

//Not actual code, but it should demonstrate the point    

class Monitor{//singleton construction omitted for brevity
    static $members = array();//keeps record of all objects
    static $dirty = array();//keeps record of all modified objects
    static $clean = array();//keeps record of all clean objects
}

class Mapper{//queries database, maps values to object fields
    public function find($id){
        if(isset(Monitor::members[$id]){
        return Monitor::members[$id];
    }
    $values = $this->selectStmt($id);
    //field mapping process omitted for brevity
    $Object = new Object($values);
    Monitor::new[$id]=$Object
    return $Object;
}

$User = $UserMapper->find(1);//domain object is registered in Id Map
$User->changePropertyX();//object is marked "dirty" in UoW

// at this point, I can save by passing the Domain Object back to the Mapper
$UserMapper->save($User);//object is marked clean in UoW

//but a nicer API would be something like this
$User->save();

//but if I want to do this - it has to make a call to the mapper/db somehow    
$User->getBlogPosts();

//or else have to generate specific collection/object graphing methods in the mapper
$UserPosts = $UserMapper->getBlogPosts();
$User->setPosts($UserPosts);

关于如何处理这种情况有什么建议吗?

我不愿意将映射器/数据库访问的实例传递/生成到域对象本身以满足 DI - 同时,避免这会导致域对象内对外部静态方法的大量调用。

虽然我想如果我想让“保存”成为它行为的一部分,那么在它的构造中就需要一个工具来做到这一点。也许是责任的问题,Domain Object 不应该有保存的负担。这只是 Active Record 模式的一个非常巧妙的功能 - 如果能以某种方式实现它会很好。

最佳答案

我所做的,尽管可能不是最好的做法,是为我的类制定一个明确的命名约定,FI:user_User 是域对象,user_mapper_User是它的映射器。

在我的父 domainObject 类中,我对逻辑进行编码以找到它的映射器。

然后您有几个选项可以委托(delegate)给它,一个明显的方法是在 domainObject 中使用 __call() 方法。

关于PHP 面向对象 : Avoid Singleton/Static Methods in Domain Model Pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2697504/

相关文章:

php - 使用 PHP 从 1.3GB 文本文件中提取文本的最佳方法?

php - Cakephp:如何使用迁移插入记录

c++ - 使用未声明的标识符 C++

ruby-on-rails - 如何模拟说唱音乐的诠释

php - CakePHP - 导航到页面时的空白页面

PHP,正则表达式仅替换两个字符,仅此而已

php - laravel 中的重定向循环

python - 理解 Python 中的 __init__

php - PHP/Twitter/Facebook 应用程序的 OOP 结构

javascript - 如何在 Vue 组件中绑定(bind)模型