Ujawnienie: Jestem opiekunem event_aggregator
gem
W zależności od tego, jak chcesz zgłosić się do problem, który można potencjalnie wykorzystać agregator zdarzeń ator. W ten sposób możesz publikować wiadomości określonego typu, a następnie słuchać obiektów, które chcesz otrzymywać. Może to w niektórych przypadkach być lepsze niż normalne zdarzenia, ponieważ uzyskujesz bardzo luźne połączenie między swoimi obiektami. Producent zdarzeń i odbiornik nie muszą udostępniać odniesienia do drugiego.
Istnieje klejnot, który pomaga w tym o nazwie event_aggregator
. Dzięki niemu można wykonać następujące czynności:
#!/usr/bin/ruby
require "rubygems"
require "event_aggregator"
class Foo
include EventAggregator::Listener
def initialize()
message_type_register("MessageType1", lambda{|data| puts data })
message_type_register("MessageType2", method(:handle_message))
end
def handle_message(data)
puts data
end
def foo_unregister(*args)
message_type_unregister(*args)
end
end
class Bar
def cause_event
EventAggregator::Message.new("MessageType1", ["Some Stuff",2,3]).publish
end
def cause_another_event
EventAggregator::Message.new("MessageType2", ["Some More Stuff",2,3]).publish
end
end
f = Foo.new
b = Bar.new
b.cause_event
b.cause_another_event
# => Some Stuff
2
3
# => Some More Stuff
2
3
Należy pamiętać, że jest domyślnie asynchroniczny, więc jeśli tylko wykonać ten skrypt skrypt może wyjść przed zapadają wydarzenia. Aby wyłączyć async wykorzystania Zachowanie:
EventAggregator::Message.new("MessageType1", ["Some Stuff",2,3], false).publish
#The third parameter indicates async
Mam nadzieję, że może to być pomocne w przypadku
chcę użyć Wzorzec Obserwator projektu. – Ash