在Nest Js中使用工厂模式

问题描述 投票:0回答:2

我需要根据查询创建一个实例。

我有一个这样的界面:

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

export interface GatewayInterface {

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

}

这是我的类需要实现的基本方法

我像这样创建工厂类

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;
    }

}

当类型为“Telegram”时,我需要创建 telegramService 的实例,但它具有如下依赖性:

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

    ) 

显然,telegramService 实现了 GatewayInterface

所以在我的 GatewayService 中我可以这样做:

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

当服务存在依赖时,如何实现工厂模式方法? 谢谢

typescript design-patterns nestjs
2个回答
3
投票

你的工厂类也应该是一个服务,添加

@Injectable()
装饰器,然后你应该在类构造函数中注入所有服务并在你的工厂方法中使用。

@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);
    }
  }
}

0
投票

“不要使用类型、switch 或 if 语句来创建类。这是一种反模式。”

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.