细长框架:Currying vs Dependency Injection

时间:2014-12-14 16:01:57

标签: javascript php angularjs dependency-injection slim

在像Angular这样的一些框架中,您可以像这样将

注入服务和控制器
App.controller('exampleController', function($scope, ajaxService){

    ajaxService.getData().then(function(data) {

        //do something with the data

    });

});

这对Angular docs称为依赖注入 according

你也可以在Slim Framwork中做这样的事情,比如

$app->get('/example', function() use ($app, $db) {

    $data = $db->getData();

    //do something with the data

}

根据Slim docs,这称为 Currying

据我所知,这些是完全相同的事情?为什么他们用不同的名字打电话?

1 个答案:

答案 0 :(得分:2)

这里有一些有趣的阅读:What is currying What is dependency injection

无论编程语言或框架如何,我们都可以说"依赖注入" (DI)是这样的 OOP类定义的授权(参见示例)和Currying是完全不同的,让我们说函数参数简化。

DI允许您保持课程简单和解耦。如果您熟悉Laravel,ServiceProvider就是一个很好的例子。简而言之,您的类具有一个属性,该属性将被设置为另一个类的实例(通常实现一个接口),以便您可以委派一些功能。典型的例子是:

interface LogInterface {
   public function write();
}

class LogToFile implements LogInterface {
   public function write()
   {
       //Do something
   }
}

class LogToFileDB implements LogInterface {
   public function write()
   {
       //Do something
   }
}

class MyDIClass {
   private $log;

   public function __construct(LogInterface $log){
       $this->log = $log;
   }

  public function writeLog(){
       $this->log->write();
   }
}

//You can do
$myobj = new MyDIClass(new LogToFile);
//or you can do 
//$myobj = new MyDIClass(new LogToDB);

//this will work, no worries about "write()" you are delegating through DI
$myobj->writeLog();

我刚刚编写了上面的代码(可能没有功能)来说明DI。使用接口确保方法" write()"将在任何实现LogInterface的类中实现。然后,当实例化对象时,您的类强制获取LogInterface对象。忘记"写()"有效,这不是你的事。

关于Currying,技术是不同的,你只需简化函数中的参数。当使用Slim Framework时,他们说"你可以使用$ app"来讨论你的路线。我已经很多地使用了Slim,我的理解是,好吧,rathaer而不是将几个变量传递给你的路由闭包只需要丰富你的$ app变量并传递1个单独的var:$ app

$app = new \Slim\Slim();
//Rather than 
//$app->get('/foo', function () use ($app, $log, $store, ...) {

$app->get('/foo', function () use ($app) {
    $app->render('foo.php'); // <-- SUCCESS
    $app->log->write();
    $app->db->store();
});