【发布时间】:2018-03-06 10:39:49
【问题描述】:
我有一个关于 IOC 的问题,当我不知道要在运行时实例化的类时。例如,我有几种类型的 View 类。 (HtmlView、CsvView、PDFView 等)实现我的视图界面。我需要的视图类的类型由用户输入(数据库中的字符串)确定。我倾向于使用具有 make 方法的 ViewFactory 类,问题是这将隐藏 View 依赖项,因为我只需要一个 ViewFactory。
class ViewFactory{
public function make($viewType){
if($viewType == 'html'){
$view = new HtmlView();
}
// ...
return $view
}
}
class ReportGenerator{
public function constructor(Array $data, ViewFactory $viewFactory, String $viewType ){
$this->data = $data;
$this->view = $viewFactory($viewType);
}
public function generate(){
return $this->view->render($this->data)
}
}
在我看来,ReportGenerator 依赖于基础 ViewInterface 似乎并不清楚。有没有更好的方法,不使用静态方法。
【问题讨论】:
-
不要以
$viewType的形式传入字符串,传入视图的typehinted interface。尽管您使用 viewFactory 来创建视图本身,这显然意味着ReportGenerator不处理实际选择应该实例化的类,但将 viewFactory 放在具体类中感觉很奇怪。我会尽快写这个作为答案。
标签: php oop design-patterns dependency-injection inversion-of-control