我正在使用一个简单的项目来帮助我理解和实现带有 DI 的 MVC,以便为单元测试做准备。该站点将根据请求的页面显示不同的数据表。困难在于数据可能来自不同的数据源(例如 mysql 或 oracle),因此我正在尝试实现 DI 以减少在两者之间切换所需的代码。我的问题是这些:
1) 在哪里实例化数据源(可以是 mysql、oracle 甚至是一个普通的旧数组)并将其传递给需要它的对象(DI 甚至是最好的模式)?
2) 在事物结构中的什么位置放置特定于其来源的数据查询?根据下面的示例,我有一个类 Foo 查询 MySQL 数据库中的数据,但如果我稍后移至 Oracle 数据库,则必须将其全部重写为不同的语法。我是否只创建两个版本 FooMysql 和 FooOracle 并告诉某处要使用的东西?
这是一些基本的,不完整的代码,展示了我所看到的概念。希望您了解我的目标,并可以为我指明正确的方向。我不是在寻找已经构建好的框架。
$c = new Controller('foo');
print_r($c->getContent());
class Controller
{
private $view = null;
public function __construct($viewName)
{
$this->view = new $viewName($dbc); // where to get and pass dbc based on view
}
}
interface ViewInterface
{
public function getContent();
}
class FooView
{
private $foo = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->foo = new Foo($dbc);
}
public function getContent()
{
return $this->foo->getAll();
}
}
class BarView
{
private $bar = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->bar = new Bar($dbc);
}
public function getContent()
{
return $this->bar->getAll();
}
}
interface StorageInterface
{
public function getAll();
}
class Foo implements StorageInterface
{
private $dbc = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->dbc = $dbc;
}
public function getAll()
{
// mysql code to get all foos
}
}
class Bar implements StorageInterface
{
private $dbc = null;
public function __construct(DatabaseConnection &$dbc)
{
$this->dbc = $dbc;
}
public function getAll()
{
// oracle code to get all bars
}
}