我试图将NestJs模块的控制器模块与域模块解耦(根据干净的体系结构原则(,以便依赖关系只流向域。我不知道如何使其工作,回购接口实现的注入不会发生(嵌套启动时出错(。
以下是模块结构:
AppModule -> CommunityControllerModule -> DomainModule
(provides repoImpl (has service requiring an unknown
by token) concrete repo interface impl)
CommunityControllerModule:
import { DomainModule } from 'libs/domain/src';
import { Module } from '@nestjs/common';
import { CommunityController } from './community.controller';
import { CommunityRepositoryImpl } from './community.repository';
@Module({
imports: [DomainModule, CommunityRepositoryImpl],
controllers: [CommunityController],
exports: [CommunityRepositoryImpl],
providers: [
{
provide: 'CommunityRepository',
useClass: CommunityRepositoryImpl,
},
],
})
export class CommunityControllerModule {}
DomainModule:
import { Module } from '@nestjs/common';
import { CommunityService } from './community.service';
@Module({
providers: [CommunityService],
exports: [CommunityService],
})
export class DomainModule {}
注入失败的CommunityService:
import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common';
import { CommunityRepository } from './community.repo';
@Injectable()
export class CommunityService {
constructor(
@Inject('CommunityRepository') private repo: CommunityRepository,
) {}
}
输出错误:
> nest start
webpack 5.28.0 compiled successfully in 8218 ms
[Nest] 7204 - 2021-05-05 20:52:05 [NestFactory] Starting Nest application...
[Nest] 7204 - 2021-05-05 20:52:05 [InstanceLoader] CommunityRepositoryImpl dependencies initialized +49ms
[Nest] 7204 - 2021-05-05 20:52:05 [ExceptionHandler] Nest can't resolve dependencies of the CommunityService (?). Please make sure that the argument CommunityRepository at index [0] is available in the DomainModule context.
Potential solutions:
- If CommunityRepository is a provider, is it part of the current DomainModule?
- If CommunityRepository is exported from a separate @Module, is that module imported within DomainModule?
@Module({
imports: [ /* the Module containing CommunityRepository */ ]
})
我错过的是将DomainModule设置为动态模块。
域模块变为:
import { DynamicModule, Module } from '@nestjs/common';
import { CommunityService } from './community.service';
@Module({})
export class DomainModule {
static register(repoImpl): DynamicModule {
return {
module: DomainModule,
imports: [repoImpl],
providers: [
CommunityService,
{
provide: 'CommunityRepository',
useClass: repoImpl,
},
],
exports: [CommunityService],
};
}
}
CommunityControllerModule将其与回购实现一起导入:
import { DomainModule } from 'libs/domain/src';
import { Module } from '@nestjs/common';
import { CommunityController } from './community.controller';
import { CommunityRepositoryImpl } from './community.repository';
@Module({
imports: [
DomainModule.register(CommunityRepositoryImpl),
CommunityRepositoryImpl,
],
controllers: [CommunityController],
exports: [CommunityRepositoryImpl],
providers: [
{
provide: 'CommunityRepository',
useClass: CommunityRepositoryImpl,
},
],
})
export class CommunityControllerModule {}