- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
今天我更新了我的项目并收到了这个警告:
Deprecated: ServiceManagerAwareInterface is deprecated and will be removed in version 3.0, along with the ServiceManagerAwareInitializer. Please update your class X to remove the implementation, and start injecting your dependencies via factory instead
我有一些实现 ServiceManagerAwareInterface
的主要 Base
类和扩展这些基类的多个类。
那么为这些类中的每一个创建额外的工厂类是一个好习惯吗?还是为每个模块使用 1 AbstractFactory 并在其中启动类更好?
使用 AbstractFactory 会影响性能吗?
在多个类中注入(inject)单个(或 2 个)共享依赖项的最佳实践是什么?
更新:即使我接受了@AlexP 的回答,但我对提供依赖项抛出构造函数有一些担忧。想象一下这个场景:我有一个带有几个 Action 的 Controller ,以免说 ActionA 需要 ServiceZ 而 ActionB 需要 ServiceY 和 ServiceX,而 ServiceX 也依赖于 ServiceM 和 ServiceN。现在每次我调用 ActionA 时,我的 Controller 都会启动所有这些服务,但 ActionA 只需要 1 项服务,而我的 Controller 加载了 5 项服务....这是一个好习惯吗?这是正确的方法吗?这不会有糟糕的性能吗,因为在每次请求时都会启动我们在该请求期间根本不会使用的服务?
现在我允许每个服务/ Controller 处理自己的需求,并在需要时加载服务。
这样我就不必启动多个我不会使用的服务,也不需要知道服务依赖关系就可以使用它们。我知道这不被接受为最佳实践,但代码很干净,我宁愿牺牲“最佳实践”以获得更好的性能。
感谢任何人对此的投入。
最佳答案
每个服务一个工厂通常是一个理想的目标;然而,在许多情况下,当您拥有具有相似依赖关系的相似类时,为每个类创建那么多的工厂是不必要的,而且难以维护。
抽象工厂通过匹配每个它可以创建的服务来解决多工厂问题,然后使用一些自定义配置返回一个新实例。
这引入了一些问题。
调用 $serviceManager->get()
或 $serviceManager->has()
将要求抽象工厂检查它是否可以使用创建服务它的 canCreateServiceWithName()
方法;对于多个抽象工厂,这可能会增加相当大的性能开销。
抽象工厂没有服务“别名”的概念;服务管理器提供的功能。该实现要求您匹配服务的 $requestedName
。如果您使用完整服务名称和别名调用服务,就会出现问题。
抽象工厂与 ZF2 框架紧密耦合。
框架的路线图非常注重解决这些问题,ZF3 仍然提供抽象工厂,但它也 introduces some improvements in factory design to encourage reusability你已经可以利用它了。
Note that the factory now accepts an additional required argument,
$requestedName
; v2 already passed this argument, but it was not specified in the interface itself. Because factories now can expect to receive the service name, they may be re-used for multiple services, largely replacing abstract factories in version 3.
因此我们已经可以多次使用标准工厂来提供类似的服务(在 ZF2 中)。
关于如何使用一个工厂创建类似服务的一个非常简单的示例。
'service_manager' => [
'factories' => [
'My\Service\Foo' => 'My\Factory\SharedFactory',
'My\Service\Bar' => 'My\Factory\SharedFactory',
'My\Service\Baz' => 'My\Factory\SharedFactory',
],
],
namespace My\Factory;
class SharedFactory
{
public function __invoke($serviceLocator, $name, $requestedName)
{
if (! class_exists($requestedName)) {
throw new ServiceNotCreatedException("$requestedName could not be found!");
}
return new $requestedName(
$serviceLocator->get('SomeDependacy1'),
$serviceLocator->get('SomeDependacy2')
);
}
}
您可以使用 $requestedName
参数轻松扩展它以加载自定义服务配置,以增加更大的灵 active 。
关于php - ZF2 弃用 : ServiceManagerAwareInterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36100447/
当我像这样使用 zend CLI 创建表单时,会生成一个表单并将其添加到表单文件夹中。 zf create form MyForm 我有一个自定义类,我想以相同的方式为其创建一个自定义命令,并希望查看
我有一个以 user_id 作为主键的用户表和一个以 user_date_id 作为主键的 user_dates 表,user_id 链接到用户表以及 start_date 和 end_date 字段
我得到了这个代码 $select ->from(array("e" => "embarcacoes")) ->join(array("i
我遇到了 PHP 和 Zend Framework 的这个小问题。 我使用 apt-get install libzend-framework-php 安装了 ZF它还安装了二进制 zf.sh和 ze
我有一小段(x86)程序集,我试图弄清楚它的作用。 ... 6: 81 ec 00 01 00 00 sub $0x100, %esp c: 31 c9
我正在将 ZF 用于 MVC 应用程序,并且对我的代码应该如何构建感到非常困惑。 我有一个过程应用程序,它基本上是 1 个巨大的长文件,其中包含我希望我的应用程序执行的所有功能......例如:get
我的身份验证适配器如下所示 $authAdapter->setTableName('register') ->setIdentityColumn('u
我们最近开始使用 Doctrine 2.2 和 Zend Framework 2 的一部分,以努力改进组织、减少重复等。今天,我开始提出实现服务层的想法,以充当我们的 Controller 和 Doc
我是 phpunit 测试的新手。任何人都可以帮助我如何测试图像中下面的行。 到目前为止我的测试是: public function testCanSendEmail() { $formDat
我正在尝试写这个,用 zf select 查询但没有成功 SELECT * FROM `subscribers` WHERE id IN (Select subscriber_id From gs_r
我正在使用 Zend Framework 的 Zend_Db_Table从数据库中获取数据的类。 我想通过向表中添加一些内容来“优化”我从表中获取的每一行。在一个普通的旧 SQL 查询中,我会写例如。
我正在尝试使用 Zend_Db 进行与此类似的更新: UPDATE `TABLE` SET column = column + 'new value' WHERE foo = 'bar' 你们
cmpxchg 的操作伪代码如下(Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2A: Instructi
我正在使用具有 REST API 的 ZF 开发应用程序。一切都很顺利,除了我的 XML 在开头有一个空白字符,所以 XML 打破了在开头有 XML 声明的规则。我正在尝试使用 javascript/
这段代码是否给了我最后插入的记录 id,即使在重载页面上? db = Zend_Db_Table::getDefaultAdapter(); $db->insert($this->_name,
为什么 lists:zf/2 是 Erlang 中 filtermap/2 的别名? 这是列表中未记录但已导出的函数:模块。这是实现: zf(F, L) -> filtermap(F, L).
我正在 x86 上调试我的代码,问题追溯到 AND 指令如果结果不为零,有时不会清除 ZF 标志。这是有问题的代码: 0257A9F9 mov edx,dword ptr [ecx+
我需要使用一些没有 GCC 内在函数的 x86 指令,例如 BSF 和 BSR。使用 GCC 内联汇编,我可以编写如下内容 __INTRIN_INLINE unsigned char bsf64(un
我在将复选框包装到标签中时遇到了 Zend 装饰器 (ZF1) 的一些问题。 在我的表格中,我有一些非常简单的东西: $remember = new Zend_Form_Element_Checkbo
我有一个简单的查询,但我一辈子也想不通。 我有一个包含“thread_id”和“messages”列的(简化的)“messages”表 我还有一个线程列表,每个线程需要 10 个结果。 $list =
我是一名优秀的程序员,十分优秀!