在Rails应用程序中实现Java Facade / Service概念的最佳方法

问题描述

|| 我是Rails环境的新手,来自Java企业Web应用程序背景。我想创建一些类,使您可以轻松地与公开宁静的Web服务的外部应用程序交互。在Java中,我将简单地将它们创建为无状态的Java bean / facade \,它们返回数据传输对象,它们是很好的可用对象,而不是难看的xml映射/数据。在Rails / Ruby中执行此操作的最佳方法是什么?这是我的主要问题: Facade类应该是静态的还是应该在使用服务之前实例化它们? DTO应该放在哪里? 谢谢, 皮埃尔 更新:我们最终使用了此答案中所述的服务:将事务操作从控制器移开     

解决方法

        不适用于模型或控制器的代码位于
lib
文件夹中。 “ 1”通常仅用于生成HTML或其他UI相关结果的视图相关代码。 我通常将它们创建为实例化的常规类,并具有实例方法来访问外部rest服务-这可以使它们的测试更加容易。但这实际上只是一个偏好问题(并且还取决于每个请求需要多少状态/重复使用这些对象-取决于您正在做什么)。 在这种情况下,\“ DTO \\”只是普通的Ruby类-如果它们中没有任何逻辑,甚至可能是简单的Struct实例。如果它们是Ruby类,它们将生活在
app/models
中,但是它们不会扩展ActiveRecord :: Base(或其他任何东西)     ,        您可能想看看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(在此示例中为该结构的xml映射到http://dev.twitter.com/doc/get/statuses/public_timeline)映射到哈希,然后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
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...