【问题标题】:Best way to implement the java facade/service concept in rails application在 Rails 应用程序中实现 java 外观/服务概念的最佳方法
【发布时间】:2011-06-14 12:28:40
【问题描述】:

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

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

DTO 应该放在哪里?

谢谢, 皮埃尔

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

【问题讨论】:

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

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    你可能想看看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 以了解此示例中的结构)映射到哈希,然后 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多