Exploring DDD in Go
Switch branches/tags
Nothing to show
Clone or download
Latest commit cd1b1d1 Sep 6, 2018
Permalink
Failed to load latest commit information.
booking Replace type embedding with field Sep 6, 2018
cmd/shippingsvc Move the routing domain service interface to root Sep 6, 2018
handling Replace type embedding with field Sep 6, 2018
inmem Merge domain modules Sep 6, 2018
inspection Merge domain modules Sep 6, 2018
mock Merge domain modules Sep 6, 2018
mongo Merge domain modules Sep 6, 2018
routing Move the routing domain service interface to root Sep 6, 2018
server Remove go-kit transport Sep 6, 2018
tracking Replace type embedding with field Sep 6, 2018
vendor Update to Go modules Sep 6, 2018
.travis.yml Update to Go modules Sep 6, 2018
CONTRIBUTING.md Add CONTRIBUTING.md Dec 15, 2015
Dockerfile Move main.go to cmd Jul 6, 2018
LICENSE Deploy to Google App Engine. Sep 20, 2014
Makefile Move main.go to cmd Jul 6, 2018
README.md Update README.md May 1, 2017
cargo.go Merge domain modules Sep 6, 2018
cargo_test.go Merge domain modules Sep 6, 2018
delivery.go Merge domain modules Sep 6, 2018
docker-compose.yml Add mongo repositories Jun 1, 2016
go.mod Update to Go modules Sep 6, 2018
go.sum Update to Go modules Sep 6, 2018
handling.go Merge domain modules Sep 6, 2018
itinerary.go Merge domain modules Sep 6, 2018
itinerary_test.go Merge domain modules Sep 6, 2018
location.go Merge domain modules Sep 6, 2018
routing.go Move the routing domain service interface to root Sep 6, 2018
sample_locations.go Merge domain modules Sep 6, 2018
sample_voyages.go Merge domain modules Sep 6, 2018
voyage.go Merge domain modules Sep 6, 2018

README.md

GoDDD

Build Status GoDoc Go Report Card License MIT stability-unstable

This is an attempt to port the DDD Sample App to idiomatic Go. This project aims to:

  • Demonstrate how the tactical design patterns from Domain Driven Design may be implemented in Go.
  • Serve as an example of a modern production-ready enterprise application.

Important note

This project is intended for inspirational purposes and should not be considered a tutorial, guide or best-practice neither how to implement Domain Driven Design nor enterprise applications in Go. Make sure you adapt the code and ideas to the requirements of your own application.

Porting from Java

The original application is written in Java and much thought has been given to the domain model, code organization and is intended to be an example of what you might find in an enterprise system.

I started out by first rewriting the original application, as is, in Go. The result was hardly idiomatic Go and I have since tried to refactor towards something that is true to the Go way. This means that you will still find oddities due to the application's Java heritage. If you do, please let me know so that we can weed out the remaining Java.

Running the application

Start the application on port 8080 (or whatever the PORT variable is set to).

go run main.go -inmem

If you only want to try it out, this is enough. If you are looking for full functionality, you will need to have a routing service running and start the application with ROUTINGSERVICE_URL (default: http://localhost:7878).

Docker

You can also run the application using Docker.

# Start routing service
docker run --name some-pathfinder marcusolsson/pathfinder

# Start application
docker run --name some-goddd \
  --link some-pathfinder:pathfinder \
  -p 8080:8080 \
  -e ROUTINGSERVICE_URL=http://pathfinder:8080 \
  marcusolsson/goddd /goddd -inmem

... or if you're using Docker Compose:

docker-compose up

Try it!

# Check out the sample cargos
curl localhost:8080/booking/v1/cargos

# Book new cargo
curl localhost:8080/booking/v1/cargos -d '{"origin": "SESTO", "destination": "FIHEL", "arrival_deadline": "2016-03-21T19:50:24Z"}'

# Request possible routes for sample cargo ABC123
curl localhost:8080/booking/v1/cargos/ABC123/request_routes

Contributing

If you want to fork the repository, follow these step to avoid having to rewrite the import paths.

go get github.com/marcusolsson/goddd
cd $GOPATH/src/github.com/marcusolsson/goddd
git remote add fork git://github.com:<yourname>/goddd.git

# commit your changes

git push fork

For more information, read this.

Additional resources

For watching

For reading

Related projects

The original application uses a external routing service to demonstrate the use of bounded contexts. For those who are interested, I have ported this service as well:

pathfinder

To accompany this application, there is also an AngularJS-application to demonstrate the intended use-cases.

dddelivery-angularjs

Also, if you want to learn more about Domain Driven Design, I encourage you to take a look at the Domain Driven Design book by Eric Evans.