【发布时间】:2015-02-07 06:42:19
【问题描述】:
我有两门课
ClassA , ClassB
类通常依赖于两个基本服务和存储库
ServiceA , ServiceB
类(ClassA , ClassB)使用DI原理通过构造函数注入依赖。
由于上面提到的所有三个共享一些公共服务,我想将所有公共方法和服务分组到一个类 Base 像这样
基类
class Base {
protected $A;
protected $B;
public function __construct(ServiceA $A, ServiceB $B){
$this->A = $A;
$this->B = $B;
}
}
儿童服务
class Child extends Base {
protected $C;
public function __construct(ChildDependency $C){
$this->C = $C;
}
public function doStuff()
{
//access the $A (**Its null**)
var_dump($this->A);
}
}
问题
如何在不违反 IoC 原则的情况下拥有共同的父依赖关系?
可能的情况 1
我知道我必须调用 parent::__construct() 来初始化 Base 构造函数。但是然后我必须在所有子类中定义父类的依赖关系,如下所示。
(但是对于大量的孩子,我必须重复这个过程。它违背了拥有共同 DI 点的目的)。
class Child extends Base {
protected $C;
public function __construct(ChildDependency $C, ParentDepen $A, ParentDepn $B){
parent::_contruct($A,$B);
$this->C = $C;
}
}
可能的情况 2
使用 Getter 和 Setter。但我认为他们违反了 IoC 原则。
【问题讨论】:
-
您能否与我们分享您的实际用例?我相信根据
BaseChild和实际依赖关系可能有不同的方法来解决这个问题。 -
这听起来像是你打破了SRP(可能还有其他一些SOLID 原则),以及拥有lasagna code。
-
ClassA , ClassB他们在哪里? -
@sectus 它们在同一个文件夹中。但不限于在这里。
-
我需要更多的上下文来确定可能的设计缺陷在哪里。您要解决的具体问题是什么?