我需要使用服务在服务容器中设置一个参数(一个整数),就像我可以使用服务配置中定义的另一个服务(通过定义工厂类和方法)来创建服务一样。
我能想到的唯一方法是将值包装在一个类中,并使用上面的方法将该类创建为服务,这对我来说有点尴尬。
任何想法?
编辑澄清。我需要将一个整数值注入到许多不同的服务中。该值由服务计算。
如果它是一个对象,那么我可以将它定义为服务,并使用工厂类和定义参数创建它,然后将该服务注入需要它的其他服务中。
是否有可能为整数值做到这一点,或者我必须将其包装在一个值对象/类中才能做到这一点?
比注入服务计算结果更好的解决方案是注入服务本身:
class ProviderService {
public function calculateResult() {
return 42; // your integer result
}
}
class ConsumerService {
private $provider;
public function __construct(ProviderService $provider) {
$this->provider = $provider;
}
public function execute() {
$result = $this->provider->calulateResult();
// business logic
}
}
如果整数值的计算是昂贵的,您可以将其缓存在ProviderService
.
听起来很简单,值不能是服务。因此,您不能注入从服务派生的值。如果你保持你的配置不变,你需要定义一个值对象,或者你需要将"工厂"服务注入到需要计算值的服务中。
如果该值只依赖于配置,你可以添加一个编译器传递,计算一次该值,并将其设置给所有需要它的服务。在编译器传递期间,您可以更改Service构造函数的参数或添加对setter方法的调用。
如果值需要在运行时确定,那么创建一个新服务是有意义的。这是因为应该有一个服务来"检测"更改并"通知"所有依赖的服务。