1

我正在开发一个有很多服务对象的应用程序。通常,这些服务的工作是构建一个或多个 Active Record 模型。为了避免将我的服务绑定到应用程序,我允许用户修改模型的名称。这是一个例子:

class MyServiceObject
  attr_reader :options

  def initialize(options = {})
    @options = options
    @options[:foo_klass] ||= Foo
  end

  def do_something
    options[:foo_klass].new
  end
end

我认为它工作得很好,但我发现这个解决方案在某些情况下缺乏灵活性。例如,我有一项服务需要使用其中一个属性来查找模型。这就是我想要实现它的方式:

class MyServiceObject
  attr_reader :options

  def initialize(options = {})
    @options = options

    @options[:lookup_proc] ||= Proc.new do |attribtue|
      DefaultModel.find_by_attribute(attribtue)
    end
  end

  def do_something(attribtue)
    options[:lookup_proc].call(attribtue)
  end
end

我不确定这是最合适的解决方案。在一些文章中,他们使用了另一个服务对象,一种“适配器”,但对于这样一个简单的用例来说似乎有点过分了。

你有什么建议吗?我应该继续目前的方法吗?

4

0 回答 0