AutoMapperModule.withMapper()
в AppModule
- это единственный раз, когда вам нужно использовать AutoMapperModule
.
withMapper()
создает синглетон AutoMapper
, который будет доступен через @InjectMapper()
, когда вы хотите использовать Mapper
в Service
(или любом Injectable
).
Что касается Profile
, следующий правильный синтаксис:
@Profile()
export class MerchantProfile extends ProfileBase {
constructor(mapper: AutoMapper) { // no private readonly.
super();
mapper.createMap(Merchant, MerchantDto);
}
// no configure() method
}
Ниже приведен исходный код @nartc/automapper
, в котором написано addProfile()
:
addProfile(profile: new (mapper: AutoMapper) => MappingProfile): AutoMapper {
this._profileStorage.add(this, new profile(this));
return this;
}
Вы можете видеть, что внутренне, @nartc/automapper
будет создавать экземпляр (new profile()
) и передавать экземпляр AutoMapper
в конструктор профиля, чтобы он был доступен вам внутри Profile's constructor
Для этого кода в вашем MerchantModule
import { Module } from '@nestjs/common';
import { MerchantController } from './merchant.controller';
import { MerchantService } from './merchant.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Merchant } from './entities/merchant.entity';
// import { MerchantProfile } from './profiles/merchant.profile';
// this is all you need which is to import the profile so TypeScript can execute it. Don't need `MerchantProfile` at all
import './profiles/merchant.profile';
import { AutoMapper, AutomapperModule } from 'nestjsx-automapper';
@Module({
imports: [TypeOrmModule.forFeature([Merchant])], // don't need to import AutoMapperModule again. MerchantProfile is not a Module so you can't import it
exports: [TypeOrmModule],
controllers: [MerchantController],
providers: [MerchantService]
})
export class MerchantModule {}
В вашем MerchantController
:
@Controller('merchant')
export class MerchantController {
constructor(
private merchantService: MerchantService,
@InjectMapper() private readonly mapper: AutoMapper) { }
@Get()
public async findAll(): Promise<MerchantDto[]> {
// make sure `this.merchantService.find()` returns an Array of
// Merchant instances. If not, please provide an extra param to map()
// return this.mapper.mapArray(await this.merchantService.find(),MerchantDto);
return this.mapper.mapArray(await this.merchantService.find(), MerchantDto, Merchant); // notice the 3rd parameter is the Source model.
}
}
Пожалуйста, дайте мне знать, если это работает для вас. Если нет, пожалуйста, создайте проблему в nestjsx-automapper
репо и предоставьте воспроизводимый репозиторий, я посмотрю как можно скорее.