Контекст
У меня есть работающее приложение NodeJS, которое может взаимодействовать с CLI.
Связь осуществляется с помощью Websocket: - CLI генерирует событие для запуска задачи в работающее приложение NodeJS - приложение NodeJS отправляет События для записи сообщений в CLI
Приложение NodeJS огромно и полностью написано в POO с Typescript.
Проблема
Представьте, что у меня есть такой класс:
export class Order {
public id;
public customer;
public total;
public send() {
...
}
public static get (orderId: number) {
return new Order(api.get(orderId));
}
}
И сервер сокетов вот так:
// This event is emitted by the CLI
socket.on('sendOrder', orderId => {
socket.emit('title', 'Sending order...') // This tell to the CLI to log a title
const order = Order.get(orderId) // Retreive the Order
order.send() // Send the Order
socket.emit('exit', 'Succesfully sent') // This tell to the CLI to exit with a message
})
Я хотел бы получить текущий контекст (в моем случае, Сокет) из любого места в моем приложении, например:
export class Order {
public send() {
socket.emit('message', 'Sending 34%...')
}
}
Где я сейчас нахожусь
Если я храню контекст (в моем случае, сокет) в «глобальной» переменной и запускайте две команды CLI одновременно. Второй переопределит эту «глобальную» переменную.
Поэтому я привожу с собой сокет, пример:
export class Order {
public id;
public customer;
public total;
constructor(private socket: Socket, data) { ... }
public send() {
this.socket.emit('message', 'Sending 34%...')
}
public static get (socket, orderId: number) {
return new Order(socket, api.get(orderId));
}
}
// This event is emitted by the CLI
socket.on('sendOrder', orderId => {
socket.emit('title', 'Sending order...') // This tell to the CLI to log a title
const order = Order.get(socket, orderId) // Retreive the Order
order.send() // Send the Order
socket.emit('exit', 'Succesfully sent') // This tell to the CLI to exit with a message
})
Заключение
Подведение контекста повсеместно возникает боль, когда приложение начинает расти. Как PHP Разработчик, у меня никогда не было таких проблем, и я не мог найти что-либо, связанное с моей проблемой в Интернете.
Есть ли какой-либо дизайн шаблон для моего случая?
Этот вопрос наверняка будет закрыт для мнений. Скрестив пальцы.