我正在尝试在属性级别注入猫鼬模型,以便可以使用new Myclass()
在其他地方实例化该类。这种模式使得仅使用一项服务就可以播种不同的数据库。可以这样做吗?
NestJS docs提供了在某些情况下可以在属性级别使用@Inject()
进行属性级别注入的功能。为了复制这种模式,我编写了以下类:
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { IArticle } from 'article/interfaces/article.interface';
export class ArticleSeedService {
@InjectModel('Article') private readonly articleModel: Model<IArticle>;
seed(article) {
return new this.articleModel(article);
}
}
然后实例化此类。这种模式的目的是使不同集合成为种子,并尝试保留我的代码DRY:
import { ArticleSeedService } from './article/article-seed.service';
import { ISeedService } from './interfaces/seed-service.interface';
export class SeedServiceFactory {
private seedService: ISeedService;
private build(collectionName: string) {
if (collectionName === 'articles') {
this.seedService = new ArticleSeedService();
return;
} else {
throw new Error('Unable to seed');
}
}
/*
other methods calling this.build(collectionName)
*/
}
最后,工厂在测试模块中导入,该模块也导入了我的测试模块。因此,测试模块应提供商品模型,因为该商品模型已导入测试的模块MongooseModule.forFeature([{name: 'Article', schema: ArticleSchema}])
中。
在我的测试文件中创建了测试模块:
const module = await Test.createTestingModule({
imports: [
MongooseModule.forRoot(process.env.MONGODB_URL,
{ useNewUrlParser: true, useFindAndModify: false, useCreateIndex: true },
),
ArticleModule,
SeedServiceFactory,
],
providers: [
DocumentNotFoundExceptionFilter, AllExceptionFilter, ValidationPipe,
SeedServiceFactory,
],
})
.compile();
seedServiceFactory = module.get<SeedServiceFactory>(SeedServiceFactory);
调用SeedServiceFactory的build
方法时,不会注入模型:其值为undefined
。在这种情况下,我是否缺少DI的工作方式?
我可以在属性级别使用@InjectModel()
而不是在构造函数中使用NestJS吗?
感谢您的帮助!