Skip to content

Instantly share code, notes, and snippets.

@jesjos
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jesjos/3072f9b95f003d68ab39 to your computer and use it in GitHub Desktop.
Save jesjos/3072f9b95f003d68ab39 to your computer and use it in GitHub Desktop.
Proposal for Sandthorn 2.0
# = Example Sandthorn setup
Sandthorn.config do |sand|
sand.snapshot_store = SnapshotStore.new
sand.event_stores = {
default: SequelStore.new(url: "sqlite://my_db", snapshot_store: sand.snapshot_store)
alternative: MongoStore.new(url: "some_url", snapshot_store: sand.snapshot_store)
aux: InMemoryStore.new
}
# This maps aggregates to event stores.
# Aggregates that aren't exlicitly mapped will be stored in the default store.
# I see the need to be able to define either concrete classes or patterns.
sand.aggregate_mappings = {
alternative: [StoreAggregates::Foo, StoreAggregates::Bar]
aux: /LogAggregates/
}
end
# Example aggregate
class MyAggregate
include AggregateRoot
attr_reader :name
def initialize(name: nil)
@name = name
end
def change_name(name)
@name = name
name_changed
end
def name_changed
commit
end
end
# = Committing
# When commit is called, we just construct the appropriate event and save it in the aggregate.
# The events should be in the agreed-upon event format.
# = Saving an aggregate
# Saving means finding the appropriate event store for the aggregate type, and then calling `save_events` on the event store with any unsaved events.
# Example:
# 1. my_aggregate.save calls Sandthorn.event_store_for(my_aggregate) and gets an event_store
# 2. Call event_store.save_events(my_aggregate, my_aggregate.unsaved_events)
# Here's an incomplete implementation of AggregateRoot
module Sandthorn
module AggregateRoot
attr_reader :unsaved_events
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def event_store
Sandthorn.event_store_for(self)
end
end
def save
if unsaved_events.any?
save_events(unsaved_events)
end
end
private
def save_events(events)
event_store.save_events(self, events)
end
def event_store
self.class.event_store
end
end
end
@larskrantz
Copy link

Very nice indeed! I concur.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment