【问题标题】:How to use DI container in reusable library?如何在可重用库中使用 DI 容器?
【发布时间】:2015-06-03 15:15:32
【问题描述】:

我正在用 PHP 构建一个可重用的库,该库将被多个内部应用程序使用(有些 web 有些不使用)。我主要对我的类使用构造函数依赖注入,例如将我的 Repository 类注入到业务逻辑类中:

namespace \Company\Project\BusinessLogic;

class MyComplexBusinessWorkflow
{
    private $_repository;

    public function __construct(IMyEntityRepository $repository)
    {
        $this->_repository = $repository
    }

    ...
}

所以对于Dice,我想要这样的东西,它为库IMyEntityRepository 实现注入默认值:

$my_complex_workflow_instance = $dice->create('MyComplexBusinessWorkflow');

代替:

$my_complex_workflow_instance = new MyComplexBusinessWorkflow(new MyEntityMySQLRepository(new MysqlConnectionWrapper()));

我可以将特定的 DI 容器库嵌入到我的库代码中,但不确定如何管理容器实例(上面代码中的 $dice)本身。

【问题讨论】:

  • 不是一个真正的答案,但有点相关:container-interop 提供了一些容器实现的标准。这使您可以使用容器而无需将自己绑定到特定的实现。也许它会给你一些想法。
  • 看起来很有趣,也许你知道其他语言的类似倡议?
  • 是的,有几个 JSR 涵盖了依赖注入(这里是 Java)。除了我不知道。我们一直在 PHP-FIG 中推动 container-interop,使其成为 PSR,仍在进行中。

标签: php dependency-injection inversion-of-control ioc-container


【解决方案1】:

没有得到答案,所以请提供我的“解决方案”。我已经实现了一个单独的 Builder 类来实例化 DI 容器。

将使用库的代码将依赖于特定的容器,这可以通过接口来抽象。不幸的是,不同的 DI 容器以不同的方式工作,所以这不是一个完整的抽象。

在 cmets 中,有人指出了在 PHP 中统一 DI 容器的有趣举措:https://github.com/container-interop/container-interop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多