andrelip

andrelip

Improve Bounded Context isolation with Serializable Struct

I’ve noticed that bounded contexts made a lot more sense when all the communication between contexts happens using strictly Serializable Structs for both input and output (something like DTO). I think most people would benefit from using it and with just a few changes it could make your context easier to be self-contained and distributed in the future. Some gains of Serializable Structs interface:

  1. Intuitively Forces the user to think about relationships between contexts like Shared Kernel (both contexts should agree on the format of the data), customer/supplier (the customer sets what he need to receive) and conformist (we just accept the data they send and adapt it; for example abstracting an external Api).

  2. Have a clear contract with everything you need as input without unnecessary coupling. Pattern matching an external Structs used in business logic is weak since it should change fast and evolve independently of your domain but their public schemas should be stable and concerned about changes.

  3. The output data could be serialized so it could easily substitute the default View. No extra complexity we are just moving it from to Web View layer to the Context View (I guess we could call Serializable Struct as Views?). The Web View layer could be skipped if no custom presentation are required.

  4. When a struct used in business logic changes we have no clue that it will affect the external world since the context don’t know about controllers, views and other contexts. When we maintain a SerializableStruct inside of our context then it will be clear that it needs to be updated once a breaking change are required and it will also be clear that any change in the layout of this module WILL affect the outside world. You should never rely on a higher layer test to know if your local change will break something or not.

  5. When used as input it will hint people about providing an Input Gate to validate and sanitize that external and untrusted data. We could hint people that once we convert those structs to domain structs we should treat the input data as safe and consistent. That way we have a clear separation between validating the input data and business logic.

  6. You remove coupling in the communication and gains autonomy. It makes it easier to move from a monolith to other architectures… you just need to change how the messages flow.

Where Next?

Popular in Discussions Top

Nvim
Elixir appears to be a superior language to Python. I don’t see any advantage of Python over Elixir. Are there any?
New
pillaiindu
In django there is a cache framework backed by memcached. Rails also puts a lot of emphasis on caching, and even the idea of russian-doll...
New
AstonJ
Are there any Elixir or Erlang libraries that help with this? I’ve been thinking how streaming services like twitch have exploded recentl...
New
ejpcmac
I have discovered Nix last month and I am currently on my way to migrating to it—both on macOS at home and the full NixOS distrubution at...
New
boundedvariable
I am going through the kafka architecture. All the features what the kafka is providing are already in Erlang. I would like hear your opi...
New
rms.mrcs
A couple of days ago I was discussing with a friend about different approaches to write microservices. He said that if he was going to w...
New
eteeselink
Hi all, In the last days, two things happened: A blog post titled “They might never tell you it’s broken” made the rounds. It’s about ...
New
chulkilee
Here are the list of HTTP client libraries/wrappers, and some thoughts on HTTP client in general. I’d like to hear from others how they w...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New
kostonstyle
Hi all How can I compare haskell with elixir, included tools, webservices, ect. Thanks
New

Other popular topics Top

danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 29377 241
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36128 110
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New

We're in Beta

About us Mission Statement