0

我有这个小依赖注入容器,我实例化如下:

$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

4

2 回答 2

0

看看疙瘩的代码:

https://github.com/fabpot/Pimple

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

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

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

于 2012-12-31T15:33:21.793 回答
0

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

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

于 2012-12-31T15:42:33.207 回答