我正在处理一个有很多服务对象的应用程序。通常,这些服务的工作是构建一个或多个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
我不确定它是最合适的解决方案。在一些文章中,他们使用另一个服务对象,一种"适配器",但对于这样一个简单的用例来说似乎有些过分。
你有什么建议吗?我要继续目前的做法吗?