Можно ли внедрить модель мангусты на уровне свойств в NestJS? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь внедрить модель мангуста на уровне свойств, чтобы класс мог быть создан в другом месте с помощью new Myclass().Этот шаблон делает возможным заполнение разных баз данных, используя только один сервис.Возможно ли это сделать?

Мой код

Документы NestJS обеспечивают возможность внедрения уровня свойства в некоторых случаях, используя @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);

Когдаbuild метод SeedServiceFactory вызывается, модель не внедряется: его значение равно undefined.Я что-то упускаю из-за того, как DI работает в этом случае?

Чтобы подвести итог

Могу ли я @InjectModel() в NestJS на уровне свойств вместо того, чтобы делать это в конструкторе?

Спасибо за помощь!

...