Лучший способ реализовать концепцию java фасад / сервис в рельсовом приложении - PullRequest
2 голосов
/ 14 июня 2011

Я новичок в среде rails и пришел из корпоративного веб-приложения java.Я хочу создать несколько классов, которые позволят вам легко взаимодействовать с внешним приложением, которое предоставляет отдыхающие веб-сервисы.В Java я бы просто создал их как Java-бины / фасады без сохранения состояния, которые возвращают Объекты Передачи Данных, которые являются хорошими полезными объектами вместо уродливых карт / данных XML.Каков наилучший способ сделать это в Rails / Ruby?Вот мои основные вопросы:

Должны ли классы фасада быть статичными или вы должны создавать их экземпляры перед использованием службы?

Где должны находиться DTO?

Спасибо, Пьер

ОБНОВЛЕНИЕ: мы закончили тем, что использовали службы, как объяснено в этом ответе: Удаление транзакционных операций от контроллера

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Код, который не подходит в качестве модели или контроллера, находится в папке lib. helpers обычно предназначен только для просмотра связанного кода, который генерирует HTML или другие результаты, связанные с пользовательским интерфейсом.

Я бы обычно создавал их как обычные классы, экземпляры которых имеют методы экземпляра для доступа к внешней службе отдыха - это может упростить их тестирование. Но на самом деле это просто вопрос предпочтений (и также зависит от того, сколько состояний / повторного использования этих объектов требуется для запроса - зависит от того, что именно вы делаете).

«DTO», в данном случае, были бы просто классами Ruby - может быть, даже простыми Struct экземплярами, если в них нет никакой логики. Если бы они были классами Ruby, они бы жили в app/models, но они не расширяли бы ActiveRecord :: Base (или что-то еще)

0 голосов
/ 14 июня 2011

Возможно, вы захотите взглянуть на httparty

Вот пример того, как вы потребляете API Twitter.

# lib/twitter.rb
require 'httparty'
require 'hashie'

class Twitter
  include HTTParty
  base_uri 'twitter.com'

  def timeline
    self.class.get("/statuses/public_timeline.xml")["statuses"].map do |status| 
      Hashie::Mash.new(status)
    end
  end  
end


# client code
client = Twitter.new
message = client.timeline.first
puts message.text

Обратите внимание, что вам не нужно создавать DTO. httparty отображает xml (посмотрите на http://dev.twitter.com/doc/get/statuses/public_timeline для структуры в этом примере) на Hashes, а затем Hashie :: Mash отображает их в методы, поэтому вы можете просто сделать message.text. Это даже работает рекурсивно, так что вы можете сделать client.timeline.first.user.name.

Если вы создаете проект rails, я бы поместил twitter.rb в папку lib.

Если вы предпочитаете использовать статические методы, вы можете сделать:

require 'httparty'
require 'hashie'

class Twitter
  include HTTParty
  base_uri 'twitter.com'

  def self.timeline
    get("/statuses/public_timeline.xml")["statuses"].map do |status| 
      Hashie::Mash.new(status)
    end
  end  
end


# client code
message = Twitter.timeline.first
puts message.text
...