我有这个小依赖注入容器,我实例化如下:
$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
这样的对象?
答案 0 :(得分:0)
看看疙瘩的代码:
https://github.com/fabpot/Pimple
您可以定义不同的方法,这些方法可以返回单个实例,也可以根据容器中服务的定义方式返回多个实例。
Pimple使用$ container-> share方法来定义共享服务。那么无论你如何称呼你的服务,只关系你如何定义它们。
或者你可以使用已经拥有你需要的所有东西的疙瘩。
答案 1 :(得分:0)
对于产品案例:服务本身只有一个。该服务有一些方法可以让您创建多个产品,但这些方法很可能是数据对象,而不是服务。所以基本上你可以让$this->getContainer->getService('product')->createNew()
返回一个新的产品实例。
在某些情况下,您需要返回多个服务实例,但这些实例可能不适用。正如@camus之前提到的,Pimple是这种实现的一个很好的例子,也很容易实现和理解。