меня есть два классаSharing зависимости между классами, позволяя зависимость инъекций
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;
}
}
Child Service
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()
для инициализации базового конструктора. Но тогда я должен определить зависимость родителя во всем дочернем классе, как показано ниже.
(Но для большого количества детей я должен повторить этот процесс. Он побеждает цель иметь общую точку DI).
class Child extends Base {
protected $C;
public function __construct(ChildDependency $C, ParentDepen $A, ParentDepn $B){
parent::_contruct($A,$B);
$this->C = $C;
}
}
Возможный случай 2
Имея использовать методы получения и установки. Но я думаю, что они нарушают принцип IoC.
Не могли бы вы поделиться с вами фактическим прецедентом? Я считаю, что в зависимости от того, что «Base'' Child» и зависимостей на самом деле, могут быть разные способы решения этой проблемы. – lukasgeiter
Похоже, вы нарушаете [SRP] (http://en.wikipedia.org/wiki/Single_responsibility_principle) (и, возможно, некоторые другие [SOLID] (http://en.wikipedia.org/wiki/SOLID_%28object -oriented_design% 29), а также [код lasagna] (http://en.wikipedia.org/wiki/Spaghetti_code#Lasagna_code). –
'ClassA, ClassB' Где они? – sectus