我想在rake任务中运行服务对象,但需要更改主服务对象调用的其他服务中的方法例如,如果我有:
主要业务.rb

class MainService
  def perform
    SecondaryService.new.perform
  end
end

二级服务.rb
class SecondaryService
  def perform
    some_method
  end

  def some_method
    puts 'something'
  end
end

我想将rake任务中的一个一次性数据修复的some_method更改为puts 'anything',我可以通过简单地重新定义方法来覆盖它吗?是否有方法将其范围限定为rake任务我不希望在运行rake任务时意外调用此服务,以防万一。我在想这样的事:
一次性耙子
class SecondaryService
  def some_method
    puts 'anything'
  end
end

def one_time_change
  MainService.new.perform
end

最佳答案

你建议的代码应该可以正常工作。你可以这么做。
但是,根据上下文的不同,存在这样一种风险,即此策略可能会产生意外的后果—即,如果您意外执行类monkey patching,但希望保留原始行为,会发生什么情况?
一种更健壮的方法是使用依赖注入通过这样做,您可以用经典继承(甚至通过传递一个全新的对象)重写行为。。例如,类似于:

class MainService
  def perform(secondary_service: SecondaryService.new)
    secondary_service.perform
  end
end

class ModifiedSecondaryService < SecondaryService
  def some_method
    puts 'anything'
  end
end

现在,对于一次性rake任务,您可以运行:
PrimaryService.new.perform(secondary_service: ModifiedSecondaryService.new)

09-08 06:08