2011-06-14 69 views
2

我是rails新手,来自java企业web应用程序背景。我想创建几个类,使您可以轻松地与暴露平安Web服务的外部应用程序进行交互。在Java中,我会简单地创建这些无状态的java beans/facade,它们返回的数据传输对象是很好用的对象,而不是丑陋的XML映射/数据。在Rails/Ruby中做这件事的最好方法是什么?这里是我的主要问题:在rails应用程序中实现java facade/service概念的最佳方式

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

DTO应该放在哪里?

感谢, 皮埃尔

UPDATE:我们结束了使用服务,在这个答案解释:Moving transactional operations away from the controller不适合作为模型或控制器住在lib文件夹

+0

为什么不是这些类车型?你看过ActiveResource吗? – Jeremy 2011-06-14 14:10:26

回答

1

代码。 helpers通常仅用于生成HTML或其他UI相关结果的视图相关代码。

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

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

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 maps 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 
相关问题