typescript - Använd Factory-mönstret i Nest Js


Jag behöver skapa en instans baserad på en fråga.

Jag har ett gränssnitt som detta:

import { GatewaySendMessageDto } from "./dto/gateway-send-message.dto";
import { IGateway } from "./interfaces/IGateway";

export interface GatewayInterface {

    sendMessage(channel: IGateway, data: GatewaySendMessageDto):void

}

och det är den grundläggande metoden som mina klasser behöver implementera

Jag skapar Factory-klassen på detta sätt

export class GatewayFactory {

    public GatewayFactory(){}

    public getGateway (type) {
        
        let a = GatewayTypesEnum.Telegram;
        let gateway:GatewayInterface = null;
        switch (type){
            case 'Telegram':
                gateway = new TelegramService(??);
                break;
            case GatewayTypesEnum.Discord:
                //gateway = new foo();
                break;
        }
        return gateway;
    }

}

Jag behöver skapa en instans av telegramService när typen är 'Telegram', men den har ett beroende som:

constructor(
        @InjectModel(Gateway.name) private readonly gatewayModel: Model<Gateway>,
        private bot: Telegraf,        
        private imagesService: ImagesService,

    ) 

uppenbarligen implementerar telegramService GatewayInterface

så i min GatewayService kunde jag göra:

async sendMessageToGatway(){
        let gateway = new GatewayFactory()
        return gateway.getGateway('Telegram').sendMessage();
    }

Hur kan jag implementera Factory Pattern-metoden när tjänsten har beroenden? Tack

Svar #1

Din fabriks-klass bör också vara en tjänst, lägg till @Injectable() dekorator och sedan bör du injicera alla dina tjänster i klassens konstruktor och använda dem i din fabriksmetod.

@Injectable()
export class GatewayFactory {
  constructor(
    private readonly telegramService: TelegramService,
    private readonly discordService: DiscordService
  ) {}
  public getGateway(type) {
    switch (type) {
      case "Telegram":
        return this.telegramService;
      case "Discord":
        return this.discordService;
      default:
        throw new Error("Invalid service type: " + type);
    }
  }
}

Svar #2

„Använd inte type, switch eller if-sats för att skapa klassen. Det är ett antipatron.“

Relaterade artiklar