依赖注射 – Laravel 4:Facade vs DI(何时使用)

我的理解是使用立面作为依赖注入的替代方法。如果我错了,请更正什么不清楚是什么时候应该使用一个或另一个

每种方法的优点/缺点是什么?我应该如何确定何时使用一个或另一个

最后,为什么不使用两者?我可以创建引用一个接口的立面。看来Sentry 2是这样写的。有最好的做法吗

FACADES

Facades不是依赖注入的替代品。

Laravel Facade是服务定位器模式的实现,创建一个干净漂亮的访问对象的方式:

MyClass::doSomething();

这是静态方法PHP语法,但是Laravel改变了游戏,使它们在后台非静态,为您提供了一个漂亮,愉快和可测试的方式来编写应用程序。

依赖注射

依赖注入基本上是一种将参数传递给构造函数方法方法,同时自动分配它们。

class MyClass {

    private $property;

    public function __construct(MyOtherClass $property)
    {
        /// Here you can use the magic of Dependency Injection

        $this->property = $property

        /// $property already is an object of MyOtherClass
    }

}

更好的构建它将使用您的依赖注入构造函数中的接口:

class MyClass {

    private $property;

    public function __construct(MyInterface $property)
    {
        /// Here you can use the magic of Dependency Injection

        $this->property = $property

        /// $property will receive an object of a concrete class that implements MyInterface
        /// This class should be defined in Laravel elsewhere,but this is a way of also make 
        /// your application easy to maintain,because you can swap implementations of your interfaces
        /// easily
    }

}

但请注意,在Laravel中,您可以以相同的方式注入类和接口。要注入接口,你只需要告诉它,这将是这样的:

App::bind('MyInterface','MyOtherClass');

这将告诉Laravel,每当你的一个方法需要一个MyInterface的实例,它应该给它一个MyOtherClass。

这里发生的是这个派生体有一个“依赖性”:MyOtherClass,它将由Laravel使用IoC container自动注入。所以,当你创建一个MyClass的实例时,Laravel会自动创建一个MyOtherClass的实例并将其放在变量中$类。

依赖注入只是开发人员创建的一个奇怪的行话,就像“自动生成参数”一样简单。

何时使用一个或另一个

正如你所看到的,它们是完全不同的,所以你不需要在它们之间决定,但你必须决定在应用程序的不同部分中与一个或另一个在哪里。

使用Facades轻松地编写代码。例如:为应用程序模块创建程序包是一个很好的做法,因此,为这些程序包创建Facades也是一种让他们看起来像一个Laravel公共类并使用静态语法访问它们的方法

每次您的类需要使用数据或从另一个类处理时,请使用依赖注入。这将使您的代码可以测试,因为您将能够将这些依赖项的模拟“注入”到您的课堂中,您还将运用single responsibility原理(请查看SOLID principles)。

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...