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

在rails应用程序中实现java facade/service概念的最佳方法,java,ruby-on-rails,ruby,service,dto,Java,Ruby On Rails,Ruby,Service,Dto,我是rails环境的新手,来自java企业web应用程序背景。我想创建几个类,使您能够轻松地与公开restful web服务的外部应用程序进行接口。在java中,我只需将它们创建为无状态JavaBeans/facade,返回数据传输对象,这些对象是很好的可用对象,而不是丑陋的xml映射/数据。在Rails/Ruby中实现这一点的最佳方法是什么?以下是我的主要问题: 门面类应该是静态的还是在使用服务之前实例化它们 DTO应该放在哪里 谢谢, 皮埃尔 更新:我们最终使用了此答案中解释的服务:不适合作

我是rails环境的新手,来自java企业web应用程序背景。我想创建几个类,使您能够轻松地与公开restful web服务的外部应用程序进行接口。在java中,我只需将它们创建为无状态JavaBeans/facade,返回数据传输对象,这些对象是很好的可用对象,而不是丑陋的xml映射/数据。在Rails/Ruby中实现这一点的最佳方法是什么?以下是我的主要问题:

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

DTO应该放在哪里

谢谢, 皮埃尔


更新:我们最终使用了此答案中解释的服务:

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

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


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

您可能想看看

下面是一个如何使用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(看看本例中的结构)映射到散列,然后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

为什么这些类不是模型?你看过ActiveResource吗?