gpt4 book ai didi

javascript - 加载不同的类并执行相似的函数名

转载 作者:行者123 更新时间:2023-12-03 01:27:23 25 4
gpt4 key购买 nike

我有一个无法解决的问题。假设我们在名为 services 的目录中有一些类。每个类都包含一个 constructor()send() 方法。我们可以有不同的类,例如 DiscordSlackSMS 等。他们的目标只是通过外部服务发送通知。

我认为我必须使用包含 contructor()send() 方法的接口(interface)或抽象类,但是如何实例化每个类并调用 send() 以优雅的方式?

我的项目结构:

services/
-> discord.js
-> slack.js
-> [...]
index.js

问候。

最佳答案

我认为您正在寻找一种管理器,其中您有一个 send() 函数,可以根据参数选择特定服务。像这样的事情:

services/index.js

import SlackService from 'slack.js';
import DiscordService from 'discord.js';

export const TYPES = {
SLACK: 'slack',
DISCORD: 'discord',
};

export class ServiceManager {
services;

constructor() {
this.services = {
[TYPES.DISCORD]: new DiscordService(/* discordConfig */),
[TYPES.SLACK]: new SlackService(/* slackConfig */),
};
}

send(type, data) {
return this.services[type].send(data);
}
}

index.js

import ServiceManager from 'services/index.js';
const serviceManager = new ServiceManager();

serviceManager.send(ServiceManager.TYPES.SLACK, { message: 'Sent to Slack' });
serviceManager.send(ServiceManager.TYPES.DISCORD, { message: 'Sent to Discord' });
<小时/>

从文件动态加载服务

您可以使用 require-dir 从目录导入所有文件,然后映射这些文件以创建每个服务。各个服务文件必须以定义的语法编写,以便管理者使用它们。像这样的事情:

services/slack.js(作为所有服务文件的示例):

export const name = 'slack';

export class Service {
constructor() {
// Set up connection to slack
}

send() {
// Send something to slack
}
}

services/index.js

const requireDir = require('require-dir');

export class ServiceManager {
services;

constructor() {
const serviceObjects = requireDir('.');
this.services = Object.values(serviceObjects).reduce(
(services, { name, Service }) => {
services[name] = new Service();
return services;
}
)
}

getRegisteredServices() {
return Object.keys(this.services);
}

send(name, data) {
return this.services[name].send(data);
}

sendAll(data) {
Object.values(this.services).each(service => service.send(data));
}
}

index.js(几乎保持不变)

import ServiceManager from 'ServiceManager.js';
const serviceManager = new ServiceManager();

console.log('Registered services are: ', serviceManager.getRegisteredServices());

serviceManager.send('slack', { message: 'Sent to Slack' });
serviceManager.send('discord', { message: 'Sent to Discord' });

关于javascript - 加载不同的类并执行相似的函数名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51466858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com