如何为一次性抽取任务重写 ruby 中的方法?
How do I override a method in ruby for a one time rake task?
我想 运行 rake 任务中的服务对象,但需要更改我的主要服务对象调用的不同服务中的方法。例如,如果我有:
main_service.rb
class MainService
def perform
SecondaryService.new.perform
end
end
secondary_service.rb
class SecondaryService
def perform
some_method
end
def some_method
puts 'something'
end
end
并且我想将 some_method
更改为 puts 'anything'
,以便在 rake 任务中进行一次数据修复,我可以通过简单地重新定义方法来覆盖它吗?有没有办法限定它的范围只是耙任务?我不希望在 运行 rake 任务时意外调用此服务以防万一。我在想这样的事情:
one_time.rake
class SecondaryService
def some_method
puts 'anything'
end
end
def one_time_change
MainService.new.perform
end
您建议的代码应该可以正常工作。你可以接受那个。
但是,根据上下文,此策略可能会产生意想不到的后果 - 即,如果您不小心执行了 class 猴子修补但期望保留原始行为会发生什么?
更稳健的方法是使用依赖注入。通过这样做,您可以使用 classical 继承覆盖行为(或者甚至通过传递一个全新的对象!)。例如,类似于:
class MainService
def perform(secondary_service: SecondaryService.new)
secondary_service.perform
end
end
class ModifiedSecondaryService < SecondaryService
def some_method
puts 'anything'
end
end
现在,对于您的一次性佣金任务,您可以 运行:
PrimaryService.new.perform(secondary_service: ModifiedSecondaryService.new)
我想 运行 rake 任务中的服务对象,但需要更改我的主要服务对象调用的不同服务中的方法。例如,如果我有:
main_service.rb
class MainService
def perform
SecondaryService.new.perform
end
end
secondary_service.rb
class SecondaryService
def perform
some_method
end
def some_method
puts 'something'
end
end
并且我想将 some_method
更改为 puts 'anything'
,以便在 rake 任务中进行一次数据修复,我可以通过简单地重新定义方法来覆盖它吗?有没有办法限定它的范围只是耙任务?我不希望在 运行 rake 任务时意外调用此服务以防万一。我在想这样的事情:
one_time.rake
class SecondaryService
def some_method
puts 'anything'
end
end
def one_time_change
MainService.new.perform
end
您建议的代码应该可以正常工作。你可以接受那个。
但是,根据上下文,此策略可能会产生意想不到的后果 - 即,如果您不小心执行了 class 猴子修补但期望保留原始行为会发生什么?
更稳健的方法是使用依赖注入。通过这样做,您可以使用 classical 继承覆盖行为(或者甚至通过传递一个全新的对象!)。例如,类似于:
class MainService
def perform(secondary_service: SecondaryService.new)
secondary_service.perform
end
end
class ModifiedSecondaryService < SecondaryService
def some_method
puts 'anything'
end
end
现在,对于您的一次性佣金任务,您可以 运行:
PrimaryService.new.perform(secondary_service: ModifiedSecondaryService.new)