【问题标题】:Dependency injection and initialization of the object对象的依赖注入和初始化
【发布时间】:2014-01-26 20:05:19
【问题描述】:

我是一个不错的 OOP 和 DI 的新手,因此想知道,以下示例及其初始化我的引导类(包括依赖对象)的模式是否真的可以使用,例如:

new Session(
   new Config, 
   new Database ( 
       new Config 
   ), 
   new Page ( 
       new Config 
   ), 
   new Statistics ( 
      new Database ( 
         new Config 
      ) 
   ), 
   new Notification, 
   new Filter
);

相信熟悉DI的朋友可以说说上面bootstrap object中的那段代码吧?

它看起来有点笨重,但这可以吗?这就是我们可以称之为好吧/正确/可接受的方式吗?

【问题讨论】:

  • 它是“可用的”,但想象一下一直这样做。最好查看您配置(一次)然后用于自动解析对象和注入依赖项(多次)的 DI 容器。看看PimpleIlluminate\Container
  • @Jon 我是自动解析器的新手,能否请您发布一个包含如何使用它的示例的答案?我认为它对未来的读者很有用。
  • 好吧,我基本上是从文档中复制粘贴...我认为人们最好直接访问源代码。
  • @Jon,好的,还是谢谢你!我会弄清楚的!
  • 我必须问,为什么你有页面、统计、通知和过滤器被传递到会话中?依赖注入就是类正确运行的要求。在我看来,要让会话类起作用,你真正需要的只是'new Session($db, $config);'。

标签: php dependency-injection


【解决方案1】:

经过一段时间学习对新问题的调查,我终于得出结论,就我而言,最好的依赖注入容器是:

Dice - minimalist Dependency Injection Container for PHP.

它只有一个文件,为了让我的问题中的代码被初始化,你只需要:

(new Dice)->create('Session');

Dice DIC 会处理剩下的事情。您可以在Tom Butler(开发者)主页上阅读更多关于骰子的信息。

我个人认为这是注入依赖项的最好(最短和最简单)的方式,并且应该默认内置在 PHP 中,我真的想知道为什么不是?


为了将您的代码与特定的依赖注入容器分离,我最好建议使用自定义类包装器:

class DIC extends Dice
  {
    function __construct( $component, array $args = array(), $callback = null, $forceNewInstance = false )
      {
          return parent::create( $component, $args, $callback = null, $forceNewInstance = false );
      }
  }

这也将有助于进一步缩短初始化过程,达到令人难以置信的惊人效果。

现在,为了实例化复杂的 DI 集,例如:

new Session( new Config, new Database ( new Config ), new Page ( new Config ), new Statistics ( new Database ( new Config ) ), new Notification, new Filter );

你所要做的就是:

new DIC('Session');

如果您想将参数传递给构造函数,您可以使用:

new DIC('Session', array($param));

我不知道其他人怎么想,但我觉得这很神奇(至少到目前为止,我今天所处的位置)。

请您对可能的缺点发表评论,我将来使用此 DIC(骰子)或一般这种方法可能会面临这些问题!?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2013-07-08
    • 2018-01-15
    相关资源
    最近更新 更多