首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceManager建议

ServiceManager建议
EN

Stack Overflow用户
提问于 2013-01-30 02:50:01
回答 2查看 122关注 0票数 0

我只是在寻求处理这种情况的最佳方式的建议。

现在,我在一个名为Service的文件夹中有几个文件。这些文件联系了几个函数,这些函数当然会做一些随机的事情。这些文件中的每个文件都需要访问SM适配器。

我的问题是,我应该在每个文件中实现ServiceManagerAwareInterface,还是应该只创建一个实现ServiceManagerAwareInterface的新类,并在实现此服务的新类上扩展我的类?

这两种方式都应该正常工作,只是不确定哪种方式更合适。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-30 05:04:43

如果您认为您的系统将始终依赖于ZF2,那么这两种方法是等效的。

现在从OO设计的角度来看,我个人更喜欢先扩展服务然后实现ServiceManagerAwareInterface的方法。我甚至会对ServiceLocator上的依赖项使用一个接口来保护我的类。为什么?扩展你的类并不会花费你很多钱,同样的,让你的类依赖于接口。

让我们举个例子,假设你在一个ZF1项目中没有使用这种方法,在这个过程中,你可能已经用Zend_Registry解决了你的依赖关系。现在,让我们假设您转移到了一个ZF2实现,您认为在服务层上将代码从Zend_Registry::get($serviceX)重构到$this->getServiceManager()->get($serviceX)需要花费多少时间?

现在假设您已经选择了保护您的类,首先通过创建您自己的Service locator接口,就像这样简单:

代码语言:javascript
复制
public interface MyOwnServiceLocatorInterface{
    public function get($service);
}

在ZF1下,您已经使用Zend_Registry创建了一个适配器类:

代码语言:javascript
复制
public class MyZF1ServiceLocator implements MyOwnServiceLocatorInterface{
    public function get($service){
        Zend_Registry::get($service);
    }
}

您的服务类没有耦合到Zend_Registry,这使得重构变得更加容易。

现在,您决定迁移到ZF2,这样您就可以合理地使用ServiceManger了。然后创建这个新的Adapter类:

代码语言:javascript
复制
public class MyZF2ServiceLocator implements 
     ServiceManagerAwareInterface,MyOwnServiceLocatorInterface
{

    private $_sm;

    public function get($service){
        $this->_sm->get($service);
    }

    public function setServiceManager($serviceManager){
         $this->_sm = $serviceManager;
    }
}

同样,您的服务类没有耦合到ZF2 ServiceManger

现在,在ServiceManager上配置/注册您的服务层会是什么样子。那么,您将使用您的Module::getServiceConfig类来实现此目的:

代码语言:javascript
复制
//Module.php

public function getServiceConfig()
{
     return array(
           'factories'=>array(
                'My\ServiceA'=>function($sm){
                        return new My\ServiceA($sm->get('My\Service\Name\Space\MyZF2ServiceLocator'));
                    }

            //Some other config

            )
}

正如您所看到的,在您的服务类中不需要重构,因为我们通过依赖接口和使用适配器来保护它们。因为我们使用了闭包工厂,所以我们甚至不需要扩展我们的服务类和实现ServiceLocatorAwareInterface

现在,在总结前面的示例之前,我必须注意到,我没有处理通过工厂构造类的情况,但是,您可以查看我的一个previous answers,它不仅解决了工厂主题,而且还说明了应用程序层之间松散耦合的重要性。

票数 2
EN

Stack Overflow用户

发布于 2013-01-30 03:32:55

你可以添加初始化器来做到这一点。它可以减少在获取通过db适配器的服务中的重复注入。或者,您可以设置abstract_factories,它将减少重复的SM注册。我刚刚在这里发布了SM Cheatsheet,希望能有所帮助:)

https://samsonasik.wordpress.com/2013/01/02/zend-framework-2-cheat-sheet-service-manager/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14590071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档