У меня есть контроллер NestJS, аналогичный приведенному ниже. Поэтому в зависимости от параметра, переданного в URL-адресе, я хочу перенаправить на правильный сервис. Службы, как правило, будут иметь одинаковые функции с различной функциональностью и должны быть отдельными службами. Может быть несколько сервисов (может быть, даже больше 10). Будет только 1 контроллер, и я хочу, чтобы проверка была во всех функциях/apis в контроллере, поэтому если/иначе проверки во всех будут слишком громоздкими. Итак, как могу ли я централизовать его, чтобы я мог проверять параметр id и вызывать соответствующую службу для всех запросов API?
class Controller {
contructor(private readonly cnnService:CnnService,private readonly bbcService:BbcService)
@Get(':id')
getNewsData() {
// if id is cnn then
return this.cnnService.getNews()
// else if id is bbc then
return this.bbcService.getNews()
}
}
Должно быть просто if
, верно?
class Controller {
contructor(private readonly cnnService:CnnService,private readonly bbcService:BbcService)
@Get(':id')
getNewsData(@Param() { id }: {id: string}) {
if ( id === 'cnn') {
return this.cnnService.getNews()
} else if (id === 'bcc') {
return this.bbcService.getNews()
} else {
throw new BadRequestException(`Unknown News outlet ${id}`);
}
}
}
Если у вас есть более 4 или около того сервисов, я бы рекомендовал зарегистрировать каждый сервис как пользовательский поставщик следующим образом:
{
provide: 'cnnService',
useClass: CnnService
}
Добавив такого рода пользовательский провайдер для каждой службы новостей, которая у вас есть в вашем NewsModule
, вы можете затем внедрить класс ModuleRef
и сделать return this.moduleRef.get(${id}Service).getNews()
в методе вашего контроллера, чтобы переключаться между используемыми службами, при необходимости перехватывая ошибки в фильтр.
Если бы было так много сервисов, я бы зарегистрировал их всех с помощью аналогичной схемы именования (XService
), чтобы у всех у них были строковые токены. Тогда вы могли бы использовать moduleRef
вместо того, чтобы внедрять каждую службу и делать this.moduleRef.get(${id}Service).getNews()
и ловить ошибку, если службы нет.
Мне очень нравится эта идея, и я не знал, что мы можем это сделать. Поэтому я добавил этот код в контроллер, и он отлично работает, если я напрямую вызываю this.moduleRef.get(NewsService, {strict: false}).getNews() Only проблема в том, что имя ${id}Service инъекции, похоже, выдает ошибку, поскольку не позволяет мне это сделать. Любое предложение по этому поводу? this.moduleRef.get(${id}Service, {strict: false}).getNews() выдает ошибку
Добавил в свой ответ несколько ссылок и пример пользовательского провайдера
Спасибо, мне удалось реализовать функциональность с помощью пользовательского поставщика.
Да, но может быть несколько сервисов (может быть, даже больше 10). Будет только 1 контроллер, и я хочу, чтобы проверка была во всех функциях/API в контроллере, поэтому проверки if/else будут слишком громоздкими. Итак, как могу ли я централизовать его, чтобы я мог проверять параметр id и вызывать соответствующую службу для всех запросов API?