It is time to take a look at a better architectural solution when using DDD in Go projects. In this article, we will take a repository that has all the DDD components in place and show how a less complicated project setup can be managed, while still maintaining DDD.
The repository that we will change is from a previous article I wrote on how to implement DDD in Go. In that article, I explained all the components present in DDD as explained by Eric Evans. The repository can be found on GitHub.
All images drawn in this article are drawn by Percy Bolmér, the Gopher is drawn by Takuya Ueda, inspired by the works of Renée French. The gopher has been modified in the images
Moving Aggregates to Their Domain Package
The first thing to do is to remove the
aggregate package altogether. We learned what an Aggregate is and what rules to apply, we don’t necessarily have to name the package to aggregate. I tend to place the Aggregates in their respective domain package, so the
Customer aggregate should go inside the
customer domain. It makes a lot more sense in my opinion.
Of course, after moving the files to the
customer domain, you also need to change any reference that is pointing to
aggregate.Customer and replace it with
Customer if you’re in the customer package.
The same thing has to be performed for the
Product aggregate, it should go inside the
product domain. I won’t cover all the code changes, it should be easy enough to find and refactor all mentions of the
According to me, it looks a lot nicer having the aggregate in their domain package in this way, it also kind of makes more sense.
Deleting the aggregate folder and we have tidied up some of the code smell.
Moving ValueObjects and Entities
We still have a folder for both
valueobject, which I guess isn’t wrong. One thing that is nice about storing the shared structs in their separate package that way is to avoid Cyclical Imports.
We can achieve this in another way though, which is less bloated. Right now we have no root package at all. Move all files from entity and valueobject to the root and rename the package to
This leaves us with an even more improved…
Continue reading: https://towardsdatascience.com/how-to-structure-ddd-in-golang-28a7c3e7263b?source=rss—-7f60cf5620c9—4