Guest User

Untitled

a guest
Apr 19th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. module EventSourcing
  2.  
  3. module EventPublisher
  4.  
  5. @@subscribers=[]
  6.  
  7. def self.add_subscriber(subscriber)
  8. @@subscribers << subscriber
  9. end
  10.  
  11. def self.delete_subscriber(subscripber)
  12. @@subscribers.delete(subscriber)
  13. end
  14.  
  15. def self.get_subscribers
  16. @@subscribers
  17. end
  18.  
  19. def self.publish(event)
  20. @@subscribers.each do |subscriber|
  21. subscriber.handle(event) if subscriber.is_subscribet_to? event
  22. end
  23. end
  24.  
  25. end
  26.  
  27. module AggregateRoot
  28.  
  29. def initialize
  30. @events = []
  31. super()
  32. end
  33.  
  34. def save
  35. # Persist the entity
  36. publish_events
  37. clear_events
  38. end
  39.  
  40. def publish_events()
  41. @events.each do |event|
  42. EventSourcing::EventPublisher.publish(event)
  43. end
  44. end
  45.  
  46. private
  47. def record_event(event)
  48. @events << event
  49. end
  50.  
  51. def clear_events
  52. @events = []
  53. end
  54.  
  55. end
  56.  
  57. end
  58.  
  59. class Employee
  60.  
  61. include EventSourcing::AggregateRoot
  62.  
  63. attr_reader :name, :title
  64. attr_reader :salary
  65.  
  66. def initialize( name, title, salary)
  67. super()
  68. @name = name
  69. @title = title
  70. @salary = salary
  71. end
  72.  
  73. def salary=(new_salary)
  74. @salary = new_salary
  75. record_event( SalaryHasChangedEvent.new(self) )
  76. end
  77. end
  78.  
  79.  
  80. class SalaryHasChangedEvent
  81.  
  82. attr_reader :employee
  83.  
  84. def initialize(employee)
  85. @employee = employee
  86. end
  87. end
  88.  
  89. class CongratulateEmployeeSubscriber
  90.  
  91. def is_subscribet_to?(event)
  92. event.class == SalaryHasChangedEvent
  93. end
  94.  
  95. def handle(event)
  96. puts "Cogratulations #{event.employee.name}!!!!"
  97. end
  98.  
  99. end
  100.  
  101. EventSourcing::EventPublisher.add_subscriber(CongratulateEmployeeSubscriber.new)
  102.  
  103. fred = Employee.new("Fred Flintstone", "Crane Operator", 30000.0)
  104. fred.salary=35000.0
  105. fred.save
  106.  
  107. barney = Employee.new("Barney Rubble", "Crane Operator", 10000.0)
  108. barney.save
Add Comment
Please, Sign In to add comment