0

我目前正在构建一个支持多个不同任务的 Thor 可执行文件。一些任务调用其他任务。例如

  • 认证
    • 验证本地用户
  • 创造
    • 调用身份验证
    • 做某事
    • 调用配置
  • 配置:
    • 调用身份验证
    • 做某事

thor 的好处是我现在可以分别调用所有三个任务,但请确保仅通过调用调用一次身份验证。

但是现在在这些任务之间共享数据的最佳方式是什么。例如,在进行身份验证时,我想设置当前用户的用户 ID。因此,当我想从我们的网络服务请求数据时,我可以以相同的方式从代码中的任何位置获取用户 ID。

现在我正在通过模块实现这一点,但我不确定这是否是最好的方法。

使用 Singleton 将是另一种方式,但不知何故,这似乎有点太多了。

也许你们有更好的方法来做到这一点,或者也许使用模块是存储信息的最佳方式。

4

2 回答 2

1

我会做这样的事情:

module PRJ

  class << self
    attr_accessor :api_key, :account_name, :api_version, :api_url, ......

    def configure
     yield self
    end
  end

end

require "#{directory_of_all_other_classes}"

require 'thor'

class CLI < Thor
include Thor::Actions

def login
  ...
  PRJ.api_key = response[:api_key] 
end

由于您想在每种情况下调用 Auth,所以我认为它应该在主 CLI 文件中。

关于存储和使用数据,最好使用属性而不是常量。我可能不正确,但我更喜欢使用类属性。

现在您可以PRJ.api_key从任何地方访问和更改(在每个文件中都需要 PRJ 模块)

PS代码片段的结构可能不准确,我只是想分享一些基本骨架。对剩余的课程执行上述操作。

于 2012-03-16T17:26:56.700 回答
0

如果您只需要存储简单的数据结构,我会选择通用类变量

class Test < Thor
  @@my_shared_var = nil 

  desc 'my_first_task','sdfasdf'
  def my_first_task
    @@my_shared_var = 'foo'
  end

  desc 'my_second_task','sdfasdf'
  def my_second_task
    invoke :my_first_task
    puts @@my_shared_var
  end

end
于 2013-10-30T13:27:14.870 回答