Skip to content

Instantly share code, notes, and snippets.

@sergii
Forked from replaid/ddd-rails-tree.txt
Created June 23, 2022 10:56
Show Gist options
  • Save sergii/b662565b3001e9bf7261c5cb820d1af0 to your computer and use it in GitHub Desktop.
Save sergii/b662565b3001e9bf7261c5cb820d1af0 to your computer and use it in GitHub Desktop.
A Rails directory tree that expresses DDD layers and bounded contexts.
components/
my_bounded_context/
app/
presentation/ # This is called the "UI" layer in DDD literature, but it is also
# where things like JSON interfaces live -- any kind of presentation
# or handshake to anything outside. So "presentation" rather than "ui".
assets/
helpers/
mailers/
views/
operation/ # Would be named "application" if we weren't already in an "app" directory
controllers/
listeners/ # Wisper plumbing. These should traffic in Domain Events.
services/ # Application services, as distinct from domain services.
# http://gorodinski.com/blog/2012/04/14/services-in-domain-driven-design-ddd/
workers/ # Thin Sidekiq shells that delegate to domain services.
domain/
my_bounded_context/
my_first_aggregate/
repository.rb
my_first_aggregate_root_entity_name.rb
another_entity_in_this_aggregate.rb
an_event_about_this_stuff.rb
value_object_only_in_this_aggregate.rb
a_relevant_factory.rb
a_relevant_service.rb
another_aggregate/
repository.rb
another_aggregate_root_entity_name.rb
second_entity_in_this_other_aggregate.rb
another_event.rb
a_domain_topic_that_is_not_an_aggregate/
a_service_here.rb
perhaps_an_event.rb
and_a_value_object.rb
infrastructure/
persistence/ # ActiveRecords
# This will frequently get broken out as its own component
# that depends on the domain.
my_bounded_context/
whatever_record.rb
whatever_record_repository.rb # gets registered as the provider for the domain repository
# TODO what else in infrastructure? I'm not clear on how anything other than persistence is
# distinguished from application ("operations") logic.
# Perhaps simply promote persistence a level instead?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment