删除 RailsEventStore 中的订阅

Remove subscriptions in RailsEventStore

我正在尝试使用 RailsEventStore 在 event-sourced/CQRS 和受 DDD 启发的 Rails 5.2.x 应用程序中构建事件流的持久关系投影。

为了让我的投影仪接收新事件的通知,我使用了 Client#subscribe,效果很好。我在 Rails 初始化文件中设置我的投影仪订阅。

现在,当我 运行 测试时,大多数测试不需要事件流的投影。因此我只想在高度集成的测试中订阅。

因为我的初始化程序似乎只 运行 一次,在执行任何单独的测试之前,我需要 subscribe/unsubscribe 测试初始化​​中的投影仪。遗憾的是,我没有找到任何 Client#unsubscribe 方法的踪迹。

有没有办法在我已经订阅后取消订阅事件流?或者在 RailsEventStore 中是否有总体上更好的方法来处理这种情况?

没有Client#unsubscribe方法。相反,每个订阅 returns 一个 lambda,您调用它来撤销订阅:

irb(main):001:0> event_store
=> #<RailsEventStore::Client:0x83ea4880>
irb(main):002:0> my_handler = ->(event) { }
=> #<Proc:0x000000010d6f1720@(irb):2 (lambda)>
irb(main):003:0> revoke = event_store.subscribe(my_handler, to: [Ordering::OrderSubmitted])
=> #<Proc:0x000000010d6d3568@/Users/pawelpacana/.rubies/ruby-2.5.5/lib/ruby/gems/2.5.0/gems/ruby_event_store-0.40.1/lib/ruby_event_store/subscriptions.rb:53 (lambda)>
irb(main):004:0> revoke.call
=> [Ordering::OrderSubmitted]

https://github.com/RailsEventStore/rails_event_store/blob/cfc91c9cb367e514ba1c6de1a711a7610780b520/ruby_event_store/lib/ruby_event_store/spec/subscriptions_lint.rb#L60-L102


Or is there overall a better way to handle this situation in RailsEventStore?

我的同事 Rafał 在 https://blog.arkency.com/optimizing-test-suites-when-using-rails-event-store/ 中描述了如何根据测试用例启用或禁用特定订阅者。简而言之,想法是根据测试元数据为每个测试和过滤订阅者列表提供新的 event_store 实例。

每个测试都有新的 event_store 个实例(没有订阅者开始),您不再需要取消订阅。例如,您可以显式订阅集成测试用例:

def integrate_with_read_model
  event_store.subscribe(::MenuOffer.method(:handle_menu_offer_chosen),   to: [MenuOfferAccepted])
  event_store.subscribe(::MenuOffer.method(:handle_menu_offer_rejected), to: to: [MenuOfferDeclined])
  event_store.subscribe(::MenuOffer.method(:handle_menu_offer_is_pending), to: [MenuOfferIsPending])
  event_store.subscribe(::MenuOffer.method(:handle_menu_offer_set), to: [MenuOfferSet])
end


before(:each) { integrate_with_read_model }