Steven Van Ophem
stevenvanophem.bsky.social
Steven Van Ophem
@stevenvanophem.bsky.social
We've got one (really) big monolithic codebase that, over the years has implemented tooling that accidently looks a lot of what you're doing with Spring Modulith.
June 6, 2025 at 12:53 PM
We've chosen a microservices architecture to isolate certain legacy dependencies (like SOAP) that have caused migration pains in the past.

Some customers struggled with drawn-out releases. Moving to ms let teams work trunk-based instead of hiding behind feature flags and long-lived branches.
June 6, 2025 at 12:50 PM
Is the wifi on your cell stable when moving from room to room?
April 14, 2025 at 9:19 AM
The single uppercased character is an Oracle naming convention if I'm not mistaken
March 19, 2025 at 9:14 PM
We did this too, but then got stuck having to write endless mapping code from/to JPA. You have to keep detached objects/flushing/versioning in mind at all time.
March 13, 2025 at 4:38 PM
I agree, at customers that use hexagonal we've had endless discussions about different hexagonal flavors.

But I must say that the idea that port implementations can't use all of the domain never came up 😅 Things just wouldn't work otherwise.
March 13, 2025 at 12:59 PM
Well, "personally" I use package-by-feature and place port implementations and primary adapters as sub-packages. It works great with Java's access modifiers. If only I could mark the port implementations as "internal" to the parent package, things would be perfect 😅
March 13, 2025 at 12:55 PM
Primary ports control access to business logic for primary adapters (Rest, UI, ..). Secondary adapters (repositories) need direct domain access.

I personally don't explicitally make primary port interfaces, I just call the application service methods.
March 13, 2025 at 12:45 PM
I’m not sure I get your point. Are you saying that, for example, domain public methods are exposed to adapters that shouldn’t call them?

If not, I think you’re interpreting the literature differently than I am.

Repositories must have direct domain access to function.
March 13, 2025 at 11:58 AM
I'm a bit confused, repositories return aggregates. If the repository implementation couldn't access domain types, it wouldn't be able to rehydrate them.

The connection to the port just marks interaction points.
March 13, 2025 at 11:16 AM
The ports just define contracts, not the dependency rules. All layers depend on the domain layer, so value classes are valid dependencies anywhere in the hexagon.
March 13, 2025 at 9:59 AM
I'm not sure I follow. A value object in the domain can be used by repository implementations.
March 13, 2025 at 7:56 AM
I think having product teams doing projects is fine. But project teams that jump from product to product keep losing ownership
December 31, 2024 at 8:16 PM
Those personal projects are relaxing though. Start several, finish none without consequences.
December 22, 2024 at 7:35 PM
I also find the split between domain and event rather awkward.

High cohesion would mean service+domain+commands+events+ports on the root package for the aggregate, right?

Events can fit compact as records under a (sealed?) interface.

Package protecting mutating domain methods is also a big plus
December 21, 2024 at 11:40 AM
That was a great read!
December 15, 2024 at 7:35 AM