2016-04-20 35 views

回答

4

Rails观察者遇到与ActiveRecord回调相同的问题,主要是他们无法关闭。使用ActiveRecord回调函数,您将模型永久地耦合到回调中引用的任何内容,并且回调中出现的任何副作用总是在所有情况下发生。使用观察员只能真正解决问题。

如果我们想在上下文中使用我们的模型(我们今天没有预见到,我们不希望发生观察者回调),该怎么办?

如果你搜索的StackOverflow的“Rails的回调”,大量的 结果涉及到寻找办法,以避免发出回调 某些情况下。几乎看起来Rails开发人员发现 需要尽快避免回调。

裁判:http://samuelmullen.com/2013/05/the-problem-with-rails-callbacks/

Wisper(免责声明,这里笔者),发布商(例如模型)当事情发生显著广播事件。监听器在运行时被订阅到发布者。出版商和订阅者彼此不知情。他们不依赖彼此,而只依赖于事件。

我们的系统必须具有对象之间的依赖关系,它们需要进行通信。然而,我们希望这种依赖性尽可能小,以便将来可以在不同情况下使用对象,而这些对象我们目前可能无法预见。另请参阅Connascence以了解轻量级/硬性依赖性的示例。

使用Wisper,在不同的上下文中,您可以选择是否订阅侦听器。

例如在控制器中,我可能会订阅一些监听器,但在我的单元测试中,我可能想要测试模型隔离,而不会发生这些副作用。另一个例子可能是一个耙子任务,我想保存一个模型,但不希望发生某些副作用。或者一个管理员控制器,我想/不想在其他情况下发生/不应该发生的事情。

最后,Wisper有built-in support用于观察者不需要的事件的异步广播,它们总是同步的。

+2

感谢您的解释,它可能对其他人有用,所以我建议将它包含在存储库(README或Wiki)中的某个位置。我刚刚从Rails Observers切换到Wisper :) – jmarceli