Rails с настраиваемой службой данных TCP - PullRequest
0 голосов
/ 27 июля 2010

Я создаю приложение Rails, которому необходимо подключиться к пользовательской службе данных TCP, которая использует XML-сообщения для обмена данными.С функциональной точки зрения это не проблема, но у меня возникают проблемы с его архитектурой, которая кажется «чистой».

Краткий обзор:

Пользователь входит в приложение Rails.При входе в систему учетные данные проверяются службой данных и возвращается «идентификатор контекста».

Запрос:

<login><username>testuser</username><password>mypass</password></login>

Ответ:

<reply><context_id>123456</context_id></reply>

Этот context_id в основном является токеном сеанса.Все последующие запросы для этого пользователя должны предоставить этот context_id в сообщении XML.

Запрос:

<history><context_id>123456</context_id><start_date>1/1/2010</start_date><end_date>1/31/2010</end_date></history>

Ответ:

<reply><history_item>...</history_item><history_item>..</history_item></reply>

Я спрятал все сборки / синтаксический анализ XML в моих моделях, который работает очень хорошо.Я могу сохранить context_id в сеансе пользователя и получить его в моих контроллерах, передав его функциям модели.

@transactions = Transaction.find( { :context_id => 123456, :start_date => '1/1/2010', :end_date => '1/31/2010' } )

С точки зрения дизайна у меня есть 2 проблемы, которые я хотел бы решить:

  1. Передача context_id каждому действию модели немного болезненно.Было бы неплохо, если бы модель могла просто получить идентификатор из самого сеанса, но я знаю, что это нарушает правило разделения интересов.
  2. Существует соединение TcpSocket, которое создается / уничтожается моделями при каждом запросе.,Соединение не привязано к context_id напрямую, поэтому было бы неплохо, если бы сокет мог быть где-то сохранен и получен моделями, поэтому я не восстанавливаю соединение для каждого запроса.

ЭтоВозможно, это звучит очень запутанно, и я, наверное, ошибаюсь.Если у кого-то есть какие-либо идеи, я бы хотел их услышать.

Технические подробности: я использую Apache / mod_rails, и у меня 0 контроля над службой TCP и его архитектурой.

1 Ответ

1 голос
/ 27 июля 2010

Рассмотрите возможность перемещения доступа API к новому классу и сохраните там экземпляр TcpSocket и идентификатор контекста. Измените ваши модели так, чтобы они общались с этим классом доступа API, а не с самим сокетом.

Добавьте around_filter к вашим контроллерам, которые извлекают идентификатор контекста из сеанса, сохраняют его в классе доступа API и обнуляют его после выполнения действия. Пока ваши Rails-процессы остаются однопоточными, все будет в порядке. Если вы переключитесь на многопоточную модель, вам также потребуется изменить класс доступа API для хранения идентификатора контекста и TcpSocket в локальном потоке, и вам потребуется один TcpSocket за нитку.

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