在rails应用程序中实现java facade / service概念的最佳方法

时间:2011-06-14 12:28:40

标签: java ruby-on-rails ruby service dto

我是rails环境的新手,来自java企业Web应用程序背景。我想创建一些类,使您可以轻松地与暴露宁静Web服务的外部应用程序进行交互。在java中,我只是将它们创建为无状态java bean / facade,它们返回数据传输对象,这是很好的可用对象,而不是丑陋的xml地图/数据。在Rails / Ruby中执行此操作的最佳方法是什么?这是我的主要问题:

外观类是静态的还是应该在使用服务之前实例化它们?

DTO应该放在哪里?

谢谢, 皮尔

更新:我们最终使用了此答案中解释的服务:Moving transactional operations away from the controller

2 个答案:

答案 0 :(得分:1)

不适合作为模型或控制器的代码位于lib文件夹中。 helpers通常仅用于生成HTML或其他UI相关结果的视图相关代码。

我通常将它们创建为实例化的常规类,并具有访问外部休息服务的实例方法 - 这可以使测试更容易。但这实际上只是一个偏好问题(并且还取决于每个请求需要多少状态/重用这些对象 - 取决于您正在做什么)。

“DTO”在这种情况下只是简单的Ruby类 - 如果它们中没有任何逻辑,甚至可能是简单的Struct实例。如果它们是Ruby类,它们将存在app/models,但它们不会扩展ActiveRecord :: Base(或其他任何东西)

答案 1 :(得分:0)

您可能想看看httparty

以下是您如何使用twitter api的示例。

# 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