微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 在允许依赖注入的同时在类之间共享依赖

我有两节课

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构造函数.但是我必须在所有子类中定义Parent的依赖关系,如下所示.

(但是对于大量的孩子,我必须重复这个过程.它违背了共同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原则.

解决方法:

如果您必须从创建对象的任何内容中注入依赖项,这似乎是您最好的选择:

class Child extends Base {

    protected $C;        

    public function __construct(ServiceA $A, ServiceB $B, ChildDependency $C){
       parent::__contruct($A, $B);
       $this->C = $C;
    }
}

您可以尝试使用Traits

trait ServiceATrait {
    public $A = new ServiceA();
    public function getServiceA() { return $this->A; }
}
trait ServiceBTrait {
    public $B = new ServiceB();
    public function getServiceB() { return $this->B; }
}
class Base {
    use ServiceATrait;
    use ServiceBTrait;
}
class Child extends Base {
    protected $C;        

    public function __construct(ChildDependency $C) {
       $this->C = $C;
    }
}

function() {
    $c = new Child(new ChildDependency());
    echo $c->getServiceB()->toString();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐