0

是否可以禁用 DI 的共享选项?发现一些补丁表明它应该像这样工作:

return(array(
'di' => array(
    'definition' => array(
        'class' => array(
            'SomeService' => array(
            ),
        )
    ),
    'instance' => array(
        'SomeService' => array(
            'shared' => false
        ),
    )
)));

但不幸的是,我在使用时总是得到相同的实例$serviceManager->get('SomeService');

有任何想法吗?

4

2 回答 2

0

看起来像 ZF2 (2.1.5) 问题,因为 ServiceLocator 不检查 DI 配置。一个快速而肮脏的修复方法是$this->getServiceLocator()->setShared('SomeService', false);在调用之前使用$serviceManager->get('SomeService');

于 2013-05-02T08:00:38.567 回答
0

根据定义,服务定位器模式每次都会返回相同的服务实例。

ZF2 DI 是一种服务定位器模式;但是,获取单独实例的一种方法是使用别名:

'instance' => array(
    'alias' => array(
        'queue1' => 'Zend_Queue',
        'queue2' => 'Zend_Queue',
    ),
)

此示例取自 ZF2 pre-beta4 项目,但对于当前的 ZF2 DI 应该可以正常工作。目前,可能有更好的方法来做你所追求的(我有一段时间没有使用 DI),但这很好用。


编辑

根据这一行,进一步查看代码,您所做的应该可以工作。or关键字,当放置在'shared'与关键字'share'相同的深度时'parameter'(就像您所做的那样)应该导致->setShared()为该服务调用,并传入给定的值。

不幸的是,我无法为 DI 提供更多帮助,因为我不再使用它。

于 2013-05-02T14:15:26.053 回答