Шаблон проектирования для хранения контекста «сессий» в асинхронном приложении - PullRequest
0 голосов
/ 31 января 2020

Контекст

У меня есть работающее приложение 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 Разработчик, у меня никогда не было таких проблем, и я не мог найти что-либо, связанное с моей проблемой в Интернете.

Есть ли какой-либо дизайн шаблон для моего случая?

Этот вопрос наверняка будет закрыт для мнений. Скрестив пальцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...