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

Posted

技术标签:

【中文标题】如何在服务中注入存储库?【英文标题】: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']

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

【讨论】:

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

(Symfony 4)如何手动将供应商类添加到容器中,然后注入存储库/服务类?

如何将通用存储库(或业务逻辑层)注入 ViewModel

如何使用 Hilt 在存储库中注入应用程序上下文?

如何使用 asp.net 核心中的依赖注入在工作单元模式中延迟注入存储库

如何在C#中使用具有存储库模式的依赖注入(AutoFac)

如何在 ASP.NET Core MVC 中使用依赖注入设计存储库模式?