0

我正在构建一个 Web 应用程序,该应用程序需要能够将数据写入 mysql db 或 xml 文件,具体取决于应用程序的在线状态。

在我的模型中,我有一个超类(Dao 是数据访问对象)......

 abstract class Dao {

    static function getInstance($online_status) {

        if $online_status = 'online' {

            return new DaoMySQL;

        } else {

            return new DaoXML;

        }

    }

    abstract function dao_select();
    abstract function dao_insert();
    abstract function dao_update();
    abstract function dao_delete();

}

现在,这是我感到困惑的部分。我有一个域模型/实体类,它使用以下方法选择适当的 Dao:

$this->dao = Dao::getInstance($online_status);

所以,现在我选择了正确的数据访问对象。但是,问题是我仍然是 dao_select() 和其他函数的两个实现。现在,主要实现在各自的类 DaoMySQL 和 DaoXML 中,但是每个类中的 dao_select() 需要不同的东西。即 DaoMySQL 版本需要两个参数,$table 和 $where_statement。DaoXML(我还没有实现)将需要元素名称,也许还有另一个参数,我不知道。

所以,在我的域模型类中,调用后

$this->dao = Dao::getInstance($online_status);

这是我需要包含 dao_select() 的两个单独的本地实现(仅与域模型/实体类有关)的地方,还是这个错误?似乎我通过执行以下操作将优雅带出过程:

class EntityModel {

  $this->dao = Dao::getInstance($online_status);

  if($this->dao->type = 'mysql') {

    $result = $this->dao->dao_select($table, $where);

  } else {

    $result = $this->dao->dao_select($xml_params);

  }


} 

我觉得我正在从系统中删除简单性......这种方法是否有意义,还是有更好的方法?

4

1 回答 1

0

你这样做是不对的。

开头的几点说明:

  • 在 OOP 中,该extends语句表示的是一种关系。这意味着,虽然class Duck extends Bird一切都很好,但写作class User extends Table不是。
  • 在 MVC 中,模型不是类或类的实例。相反,它是一层应用程序,主要由两种类型的元素组成:
    1. 领域对象:包含领域业务规则和逻辑
    2. 数据访问结构:通常是处理信息存储和检索的数据映射器

认为,模型层的第三个重要部分是服务。但是有关于它是模型的一部分还是高于模型的选项。

目前您正在尝试做的是强制使用 ActiveRecord(这对于小事情来说很好,但随着项目的增长,它会成为架构的负担......这就是您现在所面临的)模式来处理动态数据源。为此,您正在诉诸程序调用。

无论如何,关键是您应该将您的DAO实例注入您的域对象(您称之为“模型”)。并且您应该将您的创建留给DAO一个单独的工厂实例,该实例将负责初始化它们并为它们提供数据源(PDO 实例或文件路径)。这样,您不仅可以分离职责,还可以“即时”交换存储目标。

要了解更多信息,您应该研究什么是依赖注入。以下是一些可能有帮助的视频:

于 2012-05-07T07:30:11.647 回答