Dependency injection ServiceManager返回相同的实例,而shared=false

Dependency injection ServiceManager返回相同的实例,而shared=false,dependency-injection,zend-framework2,Dependency Injection,Zend Framework2,我为MyClass定义了一个别名,我希望可以通过ServiceManager检索该别名,请参见下面的module.config.php示例。当我通过$this->serviceLocator->get('MyClass')在控制器中检索MyClass的实例时,我第一次得到一个新实例,然后是同一个实例。我是否在配置中遗漏了一些东西,或者我应该提交一个bug module.config.php return array( 'di' => array( 'instance

我为
MyClass
定义了一个别名,我希望可以通过ServiceManager检索该别名,请参见下面的
module.config.php
示例。当我通过
$this->serviceLocator->get('MyClass')
在控制器中检索
MyClass
的实例时,我第一次得到一个新实例,然后是同一个实例。我是否在配置中遗漏了一些东西,或者我应该提交一个bug

module.config.php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'MyClass' => 'Some\Namespace\MyClass',
            ),

            'MyClass' => array(
                'shared' => false,
             ),                 
         ),
    ),
);

我不知道
DI
,但是
ServiceManager
希望您在管理器的配置数组的根中指定
shared
(false)。大概是这样的:

'invokables' => array( // Note that you can use also 'factories', 'abstract_factories', etc.
     'Some\Namespace\MyClass' => 'Some\Namespace\MyClass',
),
'alias' => array(
    'MyClass' => 'Some\Namespace\MyClass',
),
'shared' => array(
    'MyClass' => false,
),         
请参阅手册上的
ServiceManager
配置示例

希望这有帮助:)


斯托扬

由于我的编辑未被接受,我将自己回答这个问题。最后,由于斯托扬·迪莫夫(Stoyan Dimov)将我推向了正确的方向,我转到了
ServiceManager
。不幸的是,他的回答不正确。我不得不使用
invokables
而不是
alias
。以下是正确的示例:

return array(
    'invokables' => array(
        'MyClass' => 'Some\Namespace\MyClass',
    ),

    'shared' => array(
        'MyClass' => false,
    ),
);
当我使用
alias
而不是
invokables
时,我得到了一个
异常
,即不能使用具有该名称的服务,这意味着
alias
不起作用,必须存在由
invokables
工厂
定义的现有服务,
服务
抽象工厂

按照前面的示例,我可以使用:

...
'alias' => array(
    'SomethingDifferent' => 'MyClass',
),
...

<调用<代码> $$ -> Service EntoCalto>获取(“不同的”)< /C> >我将收到一个<代码>的实例\\ \NealStaby\MyCase./P>如果没有其他好的答案可用,我会考虑重构使用Service MeMaGeRi编辑的答案,因为它不起作用,如果通过,我将接受。您的编辑被拒绝,因为您不应该修改其他人答案中的代码,除非修复格式等。如您现在所做的那样发布新答案是您的最佳选择。