我创建了一个定义了工作流程的引擎。消息进入,以某种方式处理,并被发送出去。现在我想让使用此引擎的应用程序挂钩到流程中并修改消息的处理。
我想过在应用程序中添加一个初始化程序,只是简单地说明引擎的消息处理类,但它让我觉得有点脏。
我确信有更明智的方式来做这样的事情。你能帮助我吗?
答案 0 :(得分:1)
这不是一个需要“好”答案的问题,但我发布了正确代码格式的答案。
这听起来很像是一个javascript回调方案。我们通常用ruby做的事情,有块。
猴子修补声音肯定不像预期的api那样性感,而且从用户的角度看它总是看起来很乱。我可能会喜欢使用类方法,例如:
class Foo < ActiveRecord::Base
include MyEngineConcern
on_engine_stuff do |message|
create!( name: 'hello', message: message )
end
end
您的引擎类可以使用它:
module MyEngineConcern
def self.included( base )
base.extend ClassMethods
end
module ClassMethods
def on_engine_stuff( &callback )
MyEngine::Callbacks.add callback
end
end
end
module MyEngine
class Callbacks
class << self
@_callbacks = []
def add( callback )
@_callbacks << callback
end
def process( message )
@_callbacks.each do |callback|
message = callback.call( message )
end
message
end
end
end
end
请注意,这意味着你的引擎是由模型访问的,我们可能需要更多关于它的信息来建议正确的设计。