typescript NestJS基于接口注入自定义TypeOrm存储库

uinbv5nw  于 2022-12-14  发布在  TypeScript
关注(0)|答案(2)|浏览(159)

我目前正在使用TypeOrm完成NestJS的数据库集成文档。在这些文档中,有一些示例展示了如何使用NestJS中的app.module注入自定义数据库存储库。所有这些示例都使用自定义存储库的实际类型注入类。

@Injectable()
export class AuthorService {
  constructor(private authorRepository: AuthorRepository) {}
}

此代码通过app.modules注入,方法是提供如下导入:

@Module({
  imports: [TypeOrmModule.forFeature([AuthorRepository])],
  controller: [AuthorController],
  providers: [AuthorService],
})
export class AuthorModule {}

如果你对实现编程没问题的话,这很好用,但是我更喜欢在我的类中使用接口。我已经在以前的question中找到了通过NestJS接口注入类的解决方案,但是当我尝试像这样注入我的自定义仓库时,它似乎不能正确地示例化,并且变得未定义。
(node:16658) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'save' of undefined
因此,我假设您只能通过app.模块中的forFeature()调用注入customRepositories,但据我所知,这不允许我使用接口进行注入。有没有其他方法可以注入自定义TypeOrm仓库,而不必替换实现自定义仓库的所有接口?提前感谢!

编辑

这是我目前的代码,我设法让它注入,但这仍然迫使我每次调用构造函数时使用实现而不是接口。这主要是由于模拟测试时的一个问题。
第一个

h22fl7wq

h22fl7wq1#

它应该使用InjectRepository装饰器来工作,其中您指定了Repository,但随后您键入is作为您的接口,而在测试时您只需提供IFooRepository
示例代码:

constructor(@InjectRepository(FooRepository) fooRepository: IFooRepository,
 barEventBus: EventBus) {
7y4bm7vi

7y4bm7vi2#

  • 编辑:这个答案是废话,抽象类作为接口的黑客使用不工作,因为定义的方法似乎是可选的实现,尽管被标记为抽象。*

好吧,算是让它工作了。基于这个答案https://stackoverflow.com/a/74561702/913136,我用了一个抽象类作为接口(你实际上可以implement它),因为它不需要传递字符串作为令牌。唯一的缺点是滥用了抽象类。还不确定我是否喜欢它。
不幸的是,以同样的方式使用一个实际的接口似乎是不可能的。

@Module({
  imports: [
    TypeOrmModule.forRoot({
      ...dataSource.options,
      autoLoadEntities: true,
    }),
    TypeOrmModule.forFeature([Listing]),
  ],
  controllers: [ViewListingController],
  providers: [
    {
      provide: ListingRepository,
      useClass: TypeOrmListingRepository,
    },
  ],
})

临时接口:

import { Listing } from "./Listing";

export abstract class ListingRepository {
  abstract findMostRecent: () => Promise<Listing[]>;
}

实施:
第一次

相关问题