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.“
