如何在service中注入service

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在service中注入service相关的知识,希望对你有一定的参考价值。

参考技术A 你从根本上就理解错了。
首先我们假如在用这个方法的时候,是使用get/set方法去获取的,而获取之前需要把这个类放到spring的容器中去,上面的<bean id="personService" ...</bean>这个是相当于把personService放到容器去了,所以才有了你private IPersonService personService;然后生成get、set方法,就可以直接获得service的对象,现在你的action是要使用service,假如说(就是打个比方),如果你的dao要用action,这样的话,你也需要用<bean>把你的action也放到容器中去

如何在服务中注入存储库?

【中文标题】如何在服务中注入存储库?【英文标题】:How to inject a repository inside a service? 【发布时间】:2018-01-23 08:57:00 【问题描述】:

我正在使用 Symfony 制作简单的应用程序。我在这里配置了服务

services:
app.service.comments_service:
    class: AppBundle\Service\CommentsService
    autowire: true

app.service.projects_service:
    class: AppBundle\Service\ProjectService
    autowire: true
app.service.files_service:
        class: AppBundle\Service\FilesService
        autowire: true
app.service.users_service:
            class: AppBundle\Service\UserService
            autowire: true

我的服务使用存储库(例如cmets服务使用cmets存储库)这里是CommentsService的构造函数

属性

    private $entityManager;
    private $session;
    private $manager;
    private $commentsRepository;

构造函数:

public function __construct(
    EntityManagerInterface $entityManager,
    Session $session,
    ManagerRegistry $manager,CommentsRepository $commentsRepository)

    $this->entityManager = $entityManager;
    $this->session = $session;
    $this->manager = $manager;
    $this->commentsRepository = $commentsRepository;

当我尝试运行我的应用程序时出现此错误

PHP 致命错误:未捕获 Symfony\Component\DependencyInjection\Exception\AutowiringFailedException:无法自动装配服务“AppBundle\Repository\CommentsRepository”:方法“Doctr”的参数“$em” ine\ORM\EntityRepository::__construct()" 必须有一个类型提示或明确地给出一个值。 无法自动装配服务“app.service.cmets_service”:方法“AppBundle\Service\CommentsService::__construct()”的参数“$cmetsRepository”引用类“AppBundle\Repository\CommentsRepos” itory" 但不存在这样的服务。在 C:\xampp\htdocs\WINbetTaskManager\vendor\symfony\symfony\src\Symfony\Component\DependencyInjection\Compiler\AutowirePass.php:285

有什么办法可以解决这个问题吗?

【问题讨论】:

Autowire 有很多限制,这就是其中之一。您需要使用工厂来创建存储库(基本上是 EntityManager::getRepository(Comment::class) 您可以搜索详细信息并单独定义存储库服务。我认为 autowire 应该选择它们。 @Cerad 我相信这应该是一个答案,而不是评论。虽然赞成:) @svgrafov 谢谢,虽然我知道存储库服务是如何工作的,但我对自动装配本身并没有做太多,所以我真的不知道是否会出现其他问题。换句话说,这更像是一个猜测而不是一个答案。 【参考方案1】:

所以我做了一些实验,这似乎奏效了:

// services.yml
AppBundle\Repository\CommentsRepository:
    factory: 'doctrine.orm.entity_manager:getRepository'
    arguments: ['AppBundle\Entity\Comments']

这应该为自动装配提供足够的信息来注入存储库。

【讨论】:

以上是关于如何在service中注入service的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java Filter 中注入 Service

如何在服务中注入存储库?

如何在Java Filter 中注入 Service

关于如何在Listener中注入service和ServletContextListener源码分析

关于如何在Listener中注入service和ServletContextListener源码分析

关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service