Getting a complex type as a simple type from the query string in a ASP.NET Core API controller

This is a tale of a good amount of hours of wasted time, so I鈥檓 going to document it so I remember it in the future. The idea is simple: when building an API, how can we treat a complex type as a simple type, to avoid things like primitive obsession, implement strongly typed ids and other related patterns? Let鈥檚 find out! 馃檪

January 3, 2022 路 8 min 路 1589 words 路 Jo茫o Antunes

Event-driven integration #4 - Outbox publisher (feat. IHostedService & Channels) [ASPF02O|E043]

In this episode, we鈥檒l implement the outbox publisher, or better yet, two versions of it, one better suited for lower latency and another for reliability. As we continue our event-driven path, this will be a good opportunity to introduce a couple of interesting .NET Core features: IHostedService (and BackgroundService) and System.Threading.Channels.

May 7, 2020 路 21 min 路 4397 words 路 Jo茫o Antunes

Event-driven integration #3 - Storing events in the outbox table [ASPF02O|E042]

On the footsteps of the last episode, in this one we store the inferred events in the outbox table, doing so transactionally, so we have guarantees that any change will eventually result in a published event.

April 28, 2020 路 10 min 路 1965 words 路 Jo茫o Antunes

Event-driven integration #2 - Inferring events from EF Core changes [ASPF02O|E041]

In this first step implementing event-driven integration between services, we鈥檒l hook-up into EF Core鈥檚 infrastructure, namely when saving changes, to infer if any event should be raised based on the information provided by the change tracker.

April 20, 2020 路 8 min 路 1547 words 路 Jo茫o Antunes

Event-driven integration #1 - Intro to the transactional outbox pattern [ASPF02O|E040]

As we start implementing event-driven integration, the first thing we need to do is publish the events. Although it might seem straightforward, there are some important things to consider in order to make it work reliably. In this episode, we discuss the challenges and introduce the transactional outbox pattern to help us facing these challenges.

April 13, 2020 路 4 min 路 795 words 路 Jo茫o Antunes

Event-driven integration - Overview [ASPF02O|E039]

In this episode, we take a look at the integration problem we have between services right now, go through some options to avoid or fix it, then have a quick overview of the solution we鈥檒l be implementing in the coming episodes.

April 5, 2020 路 7 min 路 1280 words 路 Jo茫o Antunes

More explicit domain error handling and fewer exceptions with Either and Error types [ASPF02O|E038]

Following up on the last episode about the Optional type, we continue taking inspiration from functional languages and introduce Either and Error types, as a way to make the possible business logic outcomes more explicit and minimize using exceptions in non-exceptional situations.

March 2, 2020 路 19 min 路 3995 words 路 Jo茫o Antunes

Better use of types - avoiding nulls with an Optional type [ASPF02O|E037]

In this post, we鈥檒l make use of a concept most commonly associated with functional programming, the Optional type (aka Option or Maybe), in order to make our code safer and more explicit when expressing a lack of value, instead of leaning on the null reference, something that I鈥檓 sure has burned us many times in the past.

February 17, 2020 路 13 min 路 2614 words 路 Jo茫o Antunes

E036 - Making things more object oriented with rich domain entities - ASPF02O

In this episode, we鈥檒l make things more object oriented, by moving some logic that鈥檚 present in the request handlers, which in fact should be present in the domain entities, that currently are just bags of data with public getters and setters.

February 6, 2020 路 9 min 路 1852 words 路 Jo茫o Antunes

E035 - Experimenting with (yet) another approach to data access organization - ASPF02O

In this episode, we鈥檒l take a look at (yet) another approach to organizing data access code, very likely overkill.

January 20, 2020 路 8 min 路 1666 words 路 Jo茫o Antunes