lb4 在不同的存储库中调用另一个存储库

lb4 call another repository in different repository

在主存储库调用不同存储库的最佳方式是什么?我尝试使用服务。例如

...

@injectable({scope: BindingScope.TRANSIENT})
export class ProjectService {
  constructor(@repository(ProjectRepository) public projectRepository: ProjectRepository) { }
}

这是我的服务代码。当我在另一个存储库中定义此服务时,我可以访问 projectRepository。但我不确定这是最好的方法。

我们可以从 Relations [1] 中获取一个页面并利用 @repository.getter() [2] 来执行依赖注入主存储库:

import {Getter} from '@loopback/core';
import {DefaultCrudRepository, repository} from '@loopback/repository';

export class MainRepository() extends DefaultCrudRepository</*...*/>{
  constructor(
    @repository.getter(ProjectRepository)
    private _projectRepositoryGetter: Getter<ProjectRepository>;
  )

  async yourFunction(): Promise<void> {
    let projectRepository = await this._projectRepositoryGetter();

    // `projectRepository` now contains an instance of ProjectRepository.
  }
}

在上面的示例中,我们利用 构造函数注入 并在名为 yourFunction 的任意函数中检索 ProjectRepository 实例。但是,您可以使用任何类型的依赖注入 [3] 并在同一闭包内的任何函数中检索实例。

为什么吸气剂?

防止循环依赖的吸气剂。这些在存储库中尤其普遍,因为它们可能具有相互关联的关系。 Getters 通过延迟绑定解析直到 LB4 应用程序明确请求来实现此目的。

何时使用服务?

服务可以被认为是比存储库更高级的抽象。它们不应该实现标准的 CRUD 或 KV 接口,也不假定它们链接到数据源。如果您需要超出存储库范围的逻辑,这将很有用。例如,服务可以实现添加新数据库记录并将文件上传到 Amazon S3 的功能。这在与数据存储接口的代码和不与数据存储接口的代码之间保持明确的分离,从而确保数据存储逻辑保持可预测、可读且易于测试。

链接

[1] https://loopback.io/doc/en/lb4/HasMany-relation.html#configuring-a-hasmany-relation (archive)

[2] https://loopback.io/doc/en/lb4/apidocs.repository.repository.getter.html (git permalink)

[3] https://loopback.io/doc/en/lb4/Dependency-injection.html#flavors-of-dependency-injection (git permalink)