是否可以在NestJS的属性级别注入猫鼬模型?

时间:2019-09-26 11:44:12

标签: mongoose dependency-injection nestjs

我正在尝试在属性级别注入猫鼬模型,以便可以使用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吗?

感谢您的帮助!

0 个答案:

没有答案