我需要根据查询创建一个实例。
我有一个这样的界面:
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();
}
当服务存在依赖时,如何实现工厂模式方法? 谢谢
你的工厂类也应该是一个服务,添加
@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);
}
}
}
“不要使用类型、switch 或 if 语句来创建类。这是一种反模式。”