我想在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)