ruby-on-rails - 在 RailsEventStore 中删除订阅
问题描述
我正在尝试使用 RailsEventStore 在事件源/CQRS 和受 DDD 启发的 Rails 5.2.x 应用程序中构建事件流的持久关系投影。
让我的投影仪接收关于我正在使用的新事件的通知Client#subscribe
,效果很好。我在 Rails 初始化文件中设置了我的投影仪订阅。
现在,当我运行测试时,大多数测试都不需要事件流的投影。因此,我希望仅在高度集成的测试中订阅。
因为我的初始化程序似乎只运行一次,所以在执行任何单独的测试之前,我需要在测试初始化中订阅/取消订阅投影仪。可悲的是,我没有找到任何Client#unsubscribe
方法的痕迹。
有没有办法在我已经订阅后取消订阅事件流?或者在 RailsEventStore 中是否有更好的方法来处理这种情况?
解决方案
没有Client#unsubscribe
办法。相反,每个订阅都会返回一个您调用以撤销订阅的 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]
或者在 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 }
推荐阅读
- postman - 从邮递员响应中提取特定值并聚合它们
- jquery - 如果日期选择器的年龄较低,则不要从日期选择器中选择日期
- excel - Excel公式从文本中删除数字+字符
- javascript - 如何获取出现次数最高的数组中的元素?
- coldfusion - 通配符作为 like 运算符中的值返回特定表中的所有数据。喜欢 '%%%%'
- redis - 获取 Redis 集群中的所有键
- spring - JAX-WS 和花括号语法
- javascript - 如何使用 Javascript 或 JQuery 从 Salesforce1 应用程序导航到 iOS 13 中的其他本机应用程序?
- c# - 从 EF Auto Scaffold 路由到 Razor 页面中的编辑页面
- android - 如何在 Android(Volley)中将我的图像上传到服务器?