Open-source project
evolutionary-architecture/evolutionary-architecture-by-example avatar
evolutionary-architecture/evolutionary-architecture-by-example

Evolutionary Architecture by Example: A Story-Based Guide to .NET Architecture Decisions

Project brief: A practical .NET architecture guide that connects modular monoliths, microservices, domain-driven design, and common architecture patterns with concrete migration examples for evolving systems.

3,581 stars550 forksC#MIT

At a glance

What is it?
This repository offers a four-chapter, story-like walkthrough of .NET architecture, starting with a simple modular monolith and evolving toward microservices. It is a decision map, not a template, and it is best for developers who want to see tradeoffs in context.
Who is it for?
Adopt this repository if you are a .NET developer or architect who wants to see how modular monolith and microservices decisions unfold in a realistic domain, with a clear narrative and code examples. Do not adopt it if you need a prescriptive template or a production-ready framework; this is a learning resource, not a starter kit.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 19 days ago.
What is it written in?
Mainly C#, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • evolutionary-architecture/evolutionary-architecture-by-example3,581 ★ · +97
Star history
Repository2026-07-302026-11-14
evolutionary-architecture/evolutionary-architecture-by-example3.5k3.6k

97 Stars in the last 107 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

What This Repository Actually Solves

The problem is not a lack of .NET architecture examples. It is an oversupply of one-size-fits-all tutorials. Each repository tends to push a single approach: Clean Architecture, Onion, Hexagonal, tactical DDD, modular monolith, or microservices. The authors, Maciej Jedrzejewski and Kamil Baczek, argue that this misses the real challenge: knowing when and how to combine these elements. The repository is a decision map, organized as a story across four chapters. It uses a Fitness domain as the running example. The intended reader is a .NET developer who has seen the patterns in isolation but needs help deciding which to apply, and when. The authors explicitly reject the idea that any one architecture is universally correct. Instead, they present an evolutionary path that starts simple and grows with domain understanding.

The Project Paradox and the Evolutionary Approach

The core concept is the Project Paradox: at project start, you must make the most important architectural decisions at the exact moment you understand the domain least. This leads to two failure modes. The first is overengineering, adopting microservices, NoSQL, or caching before you know you need them. The second is underengineering, a monolith that grows into a big ball of mud. The repository's solution is to evolve the architecture in step with your understanding. Chapter 1 starts with a single project called Fitnet, organized by vertical slices. Each business process, like SignContract, gets its own namespace. This keeps related code together and makes future removal or relocation trivial. The modules communicate through a simple in-memory queue, enough infrastructure to work without overcomplicating. The approach is deliberately minimal. The authors want you to spend time building features, not debating folder structures.

How the Chapters Build on Each Other

The repository is structured as four chapters, each with its own README and code. Chapter 1 focuses on simplicity, laying the foundation with a single project and vertical slices. Chapter 2 shifts to maintainability by separating modules. The overall description indicates that later chapters introduce architectural pattern selection and evolution, leading to a hybrid architecture combining modular monolith and microservices. The narrative is meant to be read sequentially. Each chapter builds on the previous one, showing how the architecture changes as the domain becomes clearer. This is not a reference manual. It is a guided journey, and the interactive diagram link in Chapter 1 suggests a visual component to support the story.

Getting It Running: Commands and Configuration

The README does not list explicit installation commands or configuration keys. That is a limitation. To work with the repository, you would clone it and open the solution in a .NET environment. The primary language is C#, and the backend uses minimal APIs. The repository includes a solution file. You would need to inspect the repository layout after cloning. The README does mention that modules communicate through an in-memory queue, which implies some configuration for that queue, but no specific keys are given. For a developer familiar with .NET, the path is straightforward: clone, restore, build. But the lack of a quick-start guide is a gap. The authors assume you know how to run a .NET solution, which is reasonable for the target audience but still a barrier for beginners.

What This Repository Is Not: A Template or Framework

This is not a template you can copy and adapt. It is a learning resource. The code is a vehicle for the narrative, not a reusable starting point. The authors deliberately leave some choices to you: frontend technology, logging implementation, and contract testing. They recommend Serilog for logging and Pact Net for contract testing, but they do not include them. This is a design choice. It keeps the repository focused on architecture, not infrastructure. But it also means you cannot use this as a drop-in foundation. The vertical slice structure in Chapter 1 is a pattern you can imitate, but the in-memory queue is explicitly described as 'just enough infrastructure.' For a real production system, you would need to replace it with a proper messaging solution. The repository is honest about this, which is refreshing, but it means the value is in the lessons, not the code.

Limitations and Potential Failure Modes

The most obvious limitation is the Fitness domain. It is a representative example, but it may not map to your domain's complexity. Fitness has clear bounded contexts, such as memberships and contracts. If your domain has more tangled dependencies, the evolutionary path may be harder to follow. The authors acknowledge the cliché of 'it depends,' but they do not provide a formal decision framework. They offer heuristics, not a checklist. This is a strength for learning, but a weakness if you need a prescriptive guide. The repository also assumes you are comfortable with .NET and minimal APIs. If you are not, the code examples will be a distraction.

Comparing with Alternatives: The Difference in Approach

A common alternative is a reference architecture like the eShopOnContainers or the Modular Monolith with DDD repository from Microsoft. Those projects provide a complete, production-oriented sample with a full set of patterns. The difference here is the narrative structure. Instead of showing a final architecture, this repository shows the evolution from simple to complex. It is a story, not a blueprint. Another alternative is a book like 'Clean Architecture' by Robert Martin, which is conceptual and technology-agnostic. This repository is concrete and .NET-specific. It bridges the gap between theory and practice. The key difference is that the authors do not present a target architecture. They present a process. That is rare in sample code. Most samples are static. This one is dynamic, and that is its main selling point.

Maintenance, Licensing, and Upgrade Cost

The repository is under the MIT license, which means you can use the code freely in your own projects, with attribution. The project is not archived, and the last push was in May 2025, with a release v1.2.0 on the same date. This suggests active maintenance, but the release cadence is irregular: v1.0.0 in September 2023, v1.1.0 in December 2023, and then a long gap to v1.2.0. The upgrade cost for a reader is low. You are reading and learning, not depending on a library. The code is a learning artifact, so you would not typically upgrade it. However, if you fork it and use the code in your own project, you inherit the maintenance burden. The authors recommend external tools like Serilog and Pact Net, which have their own release cycles. For a learning resource, the maintenance cost is minimal. For a production fork, it is a different story.

Editorial conclusion

Adopt this repository if you are a .NET developer or architect who wants to see how modular monolith and microservices decisions unfold in a realistic domain, with a clear narrative and code examples. Do not adopt it if you need a prescriptive template or a production-ready framework; this is a learning resource, not a starter kit. Before diving in, verify that the Fitness domain and the specific patterns (minimal APIs, in-memory queue) align with your context, and check the chapter README files for any prerequisites. The repository is actively maintained, with a release as recent as May 2025, but the value lies in the journey, not in any single artifact. Start with Chapter 1 to see the initial vertical-slice structure, then decide if the evolutionary path matches your own project's constraints.

Frequently asked questions

What is evolutionary-architecture-by-example?

It is a MIT-licensed, C#-flavoured guide to .NET solution architecture, written by two authors and organised as a story across four chapters that build on each other. Its stated purpose is a decision map for when and how to combine architectural approaches, rather than another catalogue of patterns, because the problem section argues that existing resources each present one approach as the universal solution. It uses a fitness business domain throughout.

What are the four chapters in the evolutionary architecture guide?

An initial architecture chapter focused on simplicity using a single project organised by vertical slice; a chapter on separating modules for maintainability; a chapter on extracting microservices; and a chapter on applying tactical domain-driven design. The four chapter directories at the repository root are named for those stages, so the sequence is visible before you read anything.

What does the evolutionary architecture guide leave out?

Three things, listed explicitly. The frontend technology choice, naming four frameworks as options. Logging implementation, where it recommends one specific library. And contract testing, where it suggests one specific .NET implementation. Everything else is in scope, including a hybrid architecture combining a modular monolith with microservices, loose coupling, an architecture decision log and a minimal-API backend.

What is the Project Paradox in this architecture guide?

It is the opening problem: a project has to make its crucial architectural decisions exactly when it understands the domain least, which pushes the team toward one of two extremes, an overcomplicated trap or an oversimplified pitfall. The file lists five specific things teams adopt prematurely because of trends and conference talks, including microservices before scaling needs are understood, orchestration systems, streaming solutions, document databases and caching layers.

Which architectural styles does the guide say it combines?

It names four camps that it says other resources each adopt exclusively, clean or onion or hexagonal architecture, tactical domain-driven design, a modular monolith, and microservices. What it offers instead is a hybrid architecture combining a modular monolith with microservices, plus domain-driven design at the strategic and tactical levels, loose coupling, an architecture decision log, clean coding practices and a minimal-API .NET backend.

How is the evolutionary architecture guide written and presented?

As a document format other than Markdown, with a table-of-contents attribute, two authors credited on the title line, a light and dark banner pair whose image paths point into the repository's assets directory, nine status badges of which the first uses the current badge syntax and the other eight an older accepted form, and a chat member-count badge addressed by a numeric server identifier. The first chapter's architecture diagram is hosted on a third-party diagram service rather than in the repository.

Official sources

  1. Official README
  2. Project repository
  3. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/evolutionary-architecture-evolutionary-architecture-by-example.svg)](https://hysenlabs.com/projects/evolutionary-architecture-evolutionary-architecture-by-example)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/evolutionary-architecture-evolutionary-architecture-by-example.svg)](https://hysenlabs.com/projects/evolutionary-architecture-evolutionary-architecture-by-example)

Was this useful?