【问题标题】:Dependency injection container, only for creating one instance of a class?依赖注入容器,仅用于创建一个类的实例?
【发布时间】:2012-12-31 15:24:33
【问题描述】:

我有一个小的依赖注入容器,我将其实例化如下:

$services = new Services();

如果我需要向它添加参数,我就这样做:

$services->setParameter($name, $value);

我通过我的一些对象的构造函数传递$services 的这个实例,如果我需要数据库句柄之类的东西,我只需转到$this->services->getService('db');,它会返回数据库句柄的一个实例,如果我再次调用该方法稍后它将返回与之前相同的数据库句柄实例。

我想知道的是依赖注入容器仅适用于像您的 $dbh, $config, $user, $auth 对象这样的单实例对象?

例如,我需要创建 Products 类的多个实例,但如果我这样做:

$services->setParameter('product.id', $productId);
$product[] = $services->getService('product');

它显然会创建一个Product 的新实例,但是如果我再次重复该代码,它只会返回与之前相同的实例,我显然可以稍微修改getService() 方法以便它可以返回我需要尽可能多的新实例,但是否将 DIC 用于它不适合的东西?

所以基本上 DIC 应该只返回像 $dbh, $user etc 这样的类的单个实例吗?而不是创建像Orders, Products, Invoices 这样的对象?

【问题讨论】:

    标签: php oop ioc-container


    【解决方案1】:

    看看疙瘩的代码:

    https://github.com/fabpot/Pimple

    您可以定义返回单个实例或返回多个实例的不同方法,具体取决于服务在容器中的定义方式。

    Pimple 使用 $container->share 方法来定义共享服务。那么你如何调用你的服务并不重要,重要的是你如何定义它们。

    或者你可以只使用已经拥有你需要的一切的疙瘩。

    【讨论】:

      【解决方案2】:

      对于产品案例:服务本身只有一个。该服务有一些方法允许您创建多个产品,但这些方法很可能是数据对象,而不是服务。所以基本上你可以拥有$this->getContainer->getService('product')->createNew(),它应该返回一个新的产品实例。

      在某些情况下,您需要返回多个服务实例,但这些可能不适用于您的示例。正如@camus 之前提到的,Pimple 是这种实现的一个很好的例子,也很容易实现和理解。

      【讨论】:

      • 当您使用getService('product') 时,是否会返回一个新的ProductsFactory 对象,其中包含createNew() 方法?我以前听说过用于实例化对象的工厂,当我查看您的代码时,这就是我脑海中浮现的内容。
      • 它可以是工厂,也可以是建筑商,无论您需要什么服务。除非您拥有各种类型的产品,否则服务本身没有理由成为工厂或制造商。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多