Introduction to the Evolutionary Architecture By Example
Overview
The "Evolutionary Architecture By Example" project, created by Maciej "MJ" Jedrzejewski and Kamil Baczek, offers a thoughtful exploration into software architecture using concrete examples. It addresses the common challenges software engineers face when dealing with complex architecture design in .NET. This repository serves as a comprehensive guide for those looking to understand not just a static solution but a dynamic architectural journey, evolving through real-world scenarios.
Project Objective
Identifying the Problem
The realm of software and solution architecture hosts a plethora of methodologies such as Modular Monolith, Microservices, Domain-Driven Design, and various patterns like Clean, Onion, and Hexagonal Architecture. While each has its merits, the lack of unified direction often bewilders developers who face repositories that are either overly simplistic or excessively complicated. This project addresses this gap by providing a coherent pathway to understanding architectural evolution.
The Solution
The solution unfolds like a narrative divided into four captivating chapters:
-
Chapter 1: Initial Architecture: Focus on Simplicity
- Begin with a straightforward architecture, focusing on simplicity. Business processes are modularized into namespaces, leveraging an in-memory queue for communication.
-
Chapter 2: Modules Separation: Focus on Maintainability
- Explore the separation into various projects for enhanced maintainability. This stage introduces considerations like CQRS and the use of different databases.
-
Chapter 3: Microservice Extraction: Focus on Growth
- Here, a microservice is extracted, signaling growth. A message queue is introduced to replace in-memory queues, fostering better communication and scalability.
-
Chapter 4: Applying Tactical Domain-Driven Design: Focus on Complexity
- Tackle complexity by applying Tactical Domain-Driven Design. This segment delves into advanced DDD concepts like value objects and aggregates.
Domain and Architecture
Chosen Domain
The domain explored is a Fitness Studio, an area familiar to many. The intention is to provide an engaging example without overwhelming complexity by focusing on recognizable processes such as contract signings and fitness class attendance.
Subdomains and Patterns
The architecture involves dissecting the primary domain into subdomains. Techniques like Domain Storytelling and Event Storming aid in this delineation, ensuring clarity and separation of concerns.
Potential architecture patterns emerge through this exploration:
- Active Record for simple CRUD operations.
- Domain Model for areas with significant business logic complexity.
- Transaction Script simplifies reporting tasks.
Learning Path and Repository Navigation
The repository acts like a book, each chapter building on the last. Starting with simplistic designs, it progressively integrates architectural sophistication.
Navigating through these chapters, users are encouraged to read the accompanying README files for each chapter. These files provide essential information about execution and specifics of the evolving solution structure.
Technologies Used
The application leverages C# and .NET 8, integrating tools such as Docker, Fluent Validation, Dapper, and Entity Framework to streamline development. For testing, xUnit and Verify are crucial components.
Community Engagement and Resources
A vibrant community surrounds this project, with multiple resources available for learners:
- Webinars and Presentations: Insightful talks provide an in-depth understanding of evolutionary architecture.
- Author Insights: The creators, Maciej Jedrzejewski and Kamil Baczek, bring extensive expertise, shared through blogs and social media.
What’s Next?
The project roadmap outlines future enhancements, including architecture tests and further chapters focusing on complexity.
Join the Conversation: Enthusiasts and professionals are invited to join the Evolutionary Architecture Community on Discord for discussions and shared learning experiences.
This project not only guides you through the architectural landscape but empowers you to evolve your software design pragmatically, tailored to real-world demands.