6

使用wispergem over有什么好处rails-observers吗?

乍一看,它们看起来非常相似,但 wisper 似乎更受社区的支持(基于 GH 星、提交和发布)。它们之间有什么显着差异吗?

4

1 回答 1

9

Rails 观察者遇到与 ActiveRecord 回调相同的问题,主要是它们不能被关闭。使用 ActiveRecord 回调,您将永远将模型与回调中引用的任何内容耦合,并且回调中发生的任何副作用总是在所有情况下发生。仅使用观察者才能真正解决问题。

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

如果您在 StackOverflow 中搜索“Rails 回调”,则大量结果与寻求避免在某些上下文中发出回调的方法有关。似乎 Rails 开发人员一发现回调就发现有必要避免回调。

参考:http ://samuelmullen.com/2013/05/the-problem-with-rails-callbacks/

Wisper(免责声明,此处为作者)允许发布者(例如模型)在发生重大事件时广播事件。侦听器在运行时订阅发布者。发布者和订阅者彼此一无所知。它们不是相互依赖,而是只依赖于事件。

我们的系统必然在对象之间存在依赖关系,它们需要通信。但是,我们希望这种依赖关系尽可能轻,以便将来可以在我们目前可能无法预见的不同上下文中使用对象。另请参阅Connascence以获取轻/硬依赖关系的示例。

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

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

最后,Wisper内置了对事件异步广播的支持,而 Observer 则没有,它们始终是同步的。

于 2016-04-21T10:40:38.560 回答