我有一个代表常规路径的类路径,可以用它做一些神奇的事情。每当我想在我的应用程序中处理路径时,我都想快速实例化一个路径对象并继续使用它。Path类有一些依赖项,我想使用自动关联/依赖项注入。
我所尝试的:
我将该类作为一个服务,并创建了一个工厂方法,类似于这里所描述的:https://symfony.com/doc/current/service_container/factories.html. 工厂方法接收依赖项作为参数,并将它们存储在私有属性中。只要在需要实例的地方使用依赖项注入,我就能够获得新实例。这里的依赖项没有问题。现在的问题是,使用依赖注入只能获得一个实例。是的,我可以在over上克隆一个“普通”对象,但我想有更好的解决方案。手动调用工厂方法不起作用,因为其中存在依赖项注入。
服务和控制器:
<?
// Service
namespace App\Service;
class Path {
private $dep;
public function __construct(DependencyName $dep) {
$this->dep = $dep;
}
public static function factory(DependencyName $dep) {
$path = new Path($dep);
return $path;
}
// some methods
}
// Controller
namespace App\Controller;
use App\Service\Path;
class SomeController {
public function generatePaths() {
for (int i = 0; i < 10; i++) {
$paths[] = Path::factory(/* missing dependencies */);
}
}
public function __construct(Path $path) {
// here I can have one Path without a problem
// but I need more than one
}
}
在服务业。亚马尔:
App\Service\Path:
# call the static method
factory: ['App\Service\Path', 'factory']
更一般的是:当我使用自动连接时,如何创建具有依赖关系的服务的多个实例?解决方案不应仅限于控制器。我需要在其他服务中使用此服务。
您可以在服务定义中使用shared
选项:
在服务容器中,默认情况下共享所有服务。这意味着[……]您将得到相同的实例。在某些情况下,您可能希望始终获得一个新实例。
通过这样做(因为我知道你的依赖
总是相同的),你不再需要工厂
方法,并且可以将定义更改为:
App\Service\Path:
class: App\Service\Path
shared: false
要拥有多个实例,您不能使用注入,因此您需要实现ServiceSubcriberInterface
并注册您的服务,以便您可以在每次需要时手动从容器中检索它,同时仍然利用自动连接。
我不会详细介绍,因为有几个选项,其中一个可能比其他选项更有意义,但一旦实施,就要做:
$path = $this->get('path_builder'); // Whatever your alias is
每次都会给您一个新实例。
自 1.5 后就过时了 在 Hangfire 1.5 之后,您不需要额外的配置来支持多个服务实例处理同一个后台任务,可以跳过本文了。现在使用 GUID 生成服务器标识符,因此所有实例名称都是唯一的。 可以同时在一个程序、机器或多台机器上运行多个服务器实例。每个服务实例使用分布式锁来执行协调逻辑。 在上述情况中,每个Hangfire服务器都有一个唯一的由两部分组成的供默认值标识符。最后一部分是一个程
我试图用工厂创建一些单例对象: 我想使用 getInstance(布尔新实例)方法来生成一个新对象或重用现有的单例对象。 如果newInstance为true:我将生成一个新的单例对象 如果newInstance为false:如果myObject为null,则生成一个新的并返回,或者如果myObjects不为null则返回它。 而且这个getInstance(boolean newInstance
当更改中的时,发现中的也会更改,例如是单例? 我的假设是,一个新的实例被注入到带有工厂的控制器中?
问题内容: 据我了解,当在工厂内部时,我返回一个注入到控制器中的对象。在服务内部时,我使用而不是返回任何东西来处理对象。 我当时以为服务 始终是单例 ,并且每个控制器都注入了一个 新的工厂对象 。但是,事实证明,工厂对象也是单例对象吗? 示例代码演示: 当改变的事实证明,在也发生了变化,比如是一个单身? 我的假设是在工厂的控制器中注入了新实例? 问题答案: 所有角度服务都是单例 : Docs(请参
问题内容: 我试图了解Angular中工厂和服务的概念。我在控制器下有以下代码 此代码可以正常工作。但是,当我将$ http服务移入工厂时,我无法将数据返回到控制器。 使用工厂有什么好处,因为$ http即使在控制器下也可以工作 问题答案: 将服务移出控制器的目的是实现关注点分离。服务的工作是知道如何与服务器通信,而控制器的工作是在视图数据和服务器数据之间转换。 但是,您会混淆异步处理程序以及返回
问题内容: 编辑2016年1月: 由于这仍然引起注意。自问了这个之后,我已经完成了一些AngularJS项目,对于我最常使用的那些项目,建立了一个对象并最后返回了该对象。但是,我下面的说法仍然正确。 编辑: 我想我终于了解了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的重复问题有所不同。重复项说明该服务不可实例化,但是如果您按照我在下面的演示中进行设置,它实际上是可实例化