今天我更新了我的项目并收到了这个警告:
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/
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
从Ruby2.4.0开始,对于使用某些已弃用的功能,会出现弃用警告。例如,Bignum、Fixnum、TRUE和FALSE都会触发弃用警告。当我修复我的代码时,有相当多的代码我希望它保持沉默,尤其是在Rails中。我该怎么做? 最佳答案 moduleKerneldefsuppress_warningsoriginal_verbosity=$VERBOSE$VERBOSE=nilresult=yield$VERBOSE=original_verbosityreturnresultendend>>X=:foo=>:foo>>X=:bar
我正在使用unscoped_associations我的Rails5.0.0.1应用程序中的gem。我收到这个弃用警告:DEPRECATIONWARNING:alias_method_chainisdeprecated.Please,useModule#prependinstead.Frommodule,youcanaccesstheoriginalmethodusingsuper.(calledfromat/home/rhl/myapp/config/application.rb:8)DEPRECATIONWARNING:alias_method_chainisdeprecated.
我有一个要分组的数组,“group_by”函数似乎适合我的情况。http://apidock.com/rails/Enumerable/group_by我在Rails3.2.13中使用它。grouped_array=my_array.group_by(&:my_function)#Assumerun'my_function'haveresult1onelement1,element3andresult2onelement2,element4,then:#grouped_array={#result1=>[element1,element3],#result2=>[element2,el
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?
我一直在关注这篇文章以与工头一起设置puma:https://www.digitalocean.com/community/articles/how-to-set-up-zero-downtime-rails-deploys-using-puma-and-foremanpuma脚本在连接后告诉verify_active_connections!但它在rails4中不可用。注释掉方法调用将使脚本运行但我不确定这是否会泄漏资源.关于这个问题,我能看到的唯一文档是:https://github.com/socialcast/resque-ensure-connected/issues/3但是
当我尝试像往常一样在项目上运行“bundleexeccompasswatch”时,我现在收到此警告:DEPRECATIONWARNINGonline87of/home/hedy/Sites/mywebsite.fr/src/vendor/bundle/ruby/2.3.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_deprecated-support.scss:#{}interpolationnearoperatorswillbesimplifiedinafutureversionofSass.Topreservethecurr
我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob
Lisp是否适合Web编程/应用程序(交互式),就像ruby和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common