【问题标题】:Slim framework: Currying vs Dependency InjectionSlim 框架:Currying vs 依赖注入
【发布时间】:2015-02-12 18:50:48
【问题描述】:

在 Angular 等一些框架中,您可以像这样将服务和控制器相互注入

App.controller('exampleController', function($scope, ajaxService){

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

        //do something with the data

    });

});

这称为 依赖注入 according 到 Angular 文档

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

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

    $data = $db->getData();

    //do something with the data

}

根据Slim docs,这称为柯里化

据我所知,这些是完全相同的吗?为什么叫他们不同的名字?

【问题讨论】:

    标签: javascript php angularjs dependency-injection slim


    【解决方案1】:

    这里有几个有趣的阅读: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 对象。忘记“write()”是如何工作的,这不关你的事。

    关于柯里化,技术是不同的,您只需简化函数中的参数即可。当使用 Slim 框架时,这些家伙说“你可以使用 $app 来咖喱你的路线”。我经常使用 Slim,我的理解是,好吧,与其将几个变量传递给你的路线闭包,不如丰富你的 $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();
    });
    

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 2014-09-06
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2021-08-13
      相关资源
      最近更新 更多