<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.mohamadkaravi.ir/index.php?action=history&amp;feed=atom&amp;title=Modular-Monolith-with-DDD</id>
	<title>Modular-Monolith-with-DDD - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mohamadkaravi.ir/index.php?action=history&amp;feed=atom&amp;title=Modular-Monolith-with-DDD"/>
	<link rel="alternate" type="text/html" href="https://wiki.mohamadkaravi.ir/index.php?title=Modular-Monolith-with-DDD&amp;action=history"/>
	<updated>2026-10-26T21:21:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.mohamadkaravi.ir/index.php?title=Modular-Monolith-with-DDD&amp;diff=5&amp;oldid=prev</id>
		<title>Mkaravi: Modular Monolith with DDD</title>
		<link rel="alternate" type="text/html" href="https://wiki.mohamadkaravi.ir/index.php?title=Modular-Monolith-with-DDD&amp;diff=5&amp;oldid=prev"/>
		<updated>2026-09-02T08:50:47Z</updated>

		<summary type="html">&lt;p&gt;Modular Monolith with DDD&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;================================================================================&lt;br /&gt;
MODULAR MONOLITH WITH DOMAIN-DRIVEN DESIGN (DDD)&lt;br /&gt;
Comprehensive Repository &amp;amp; Architecture Review (kgrzybek/modular-monolith-with-ddd)&lt;br /&gt;
================================================================================&lt;br /&gt;
&lt;br /&gt;
[ENGLISH SECTION - LTR]&lt;br /&gt;
================================================================================&lt;br /&gt;
&lt;br /&gt;
1. INTRODUCTION &amp;amp; PURPOSE OF THE REPOSITORY&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
The repository &amp;quot;kgrzybek/modular-monolith-with-ddd&amp;quot; by Kamil Grzybek is widely &lt;br /&gt;
regarded as one of the definitive architectural references in the software engineering &lt;br /&gt;
community. It bridges the gap between traditional monolithic systems and distributed &lt;br /&gt;
microservice architectures.&lt;br /&gt;
&lt;br /&gt;
Key Objectives:&lt;br /&gt;
* Demonstrating how to design and build a maintainable, extensible enterprise .NET &lt;br /&gt;
  application using a Modular Monolith architecture.&lt;br /&gt;
* Realizing the benefits of microservices (clear bounded contexts, domain autonomy, &lt;br /&gt;
  independent data schemas, team boundaries) without taking on operational &lt;br /&gt;
  complexities (network latency, distributed transaction coordination, eventual consistency &lt;br /&gt;
  headaches, and heavy CI/CD infrastructure).&lt;br /&gt;
* Providing a production-ready, non-trivial application reference rather than a basic &lt;br /&gt;
  proof of concept (PoC).&lt;br /&gt;
* Implementing Domain-Driven Design (DDD) tactical patterns and Testable Design principles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. DOMAIN DESCRIPTION: MEETUP PLATFORM&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
The application models a comprehensive real-world domain: an event/meeting management &lt;br /&gt;
platform similar to Meetup.com.&lt;br /&gt;
&lt;br /&gt;
Domain Concepts &amp;amp; Business Rules:&lt;br /&gt;
* Meeting Groups: Members can propose new meeting groups. Each group proposal requires &lt;br /&gt;
  administrative review and approval before becoming active.&lt;br /&gt;
* Subscriptions: Each Meeting Group must have an Organizer with an active subscription. &lt;br /&gt;
  A single subscription covers up to 3 Meeting Groups.&lt;br /&gt;
* Meetings: Only an Organizer of an active Meeting Group can create meetings. A meeting &lt;br /&gt;
  has attendees, non-attendees (members explicitly declining), and a waitlist.&lt;br /&gt;
* Quotas &amp;amp; Limits: Meetings can enforce attendee limits. When the limit is reached, new &lt;br /&gt;
  sign-ups automatically queue into the waitlist.&lt;br /&gt;
* Roles: Attendees can hold roles (Attendee or Host). Every meeting requires at least &lt;br /&gt;
  one Host who has privileges to modify meeting details and attendee rosters.&lt;br /&gt;
* Event Fees &amp;amp; Guests: Organizers can configure mandatory event fees. Attendees can invite &lt;br /&gt;
  guests if allowed, paying the required fees on behalf of their guests.&lt;br /&gt;
* Comments: Members can write comments, reply to existing comments, and like comments, &lt;br /&gt;
  governed by meeting configuration rules.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. ARCHITECTURAL BLUEPRINT &amp;amp; C4 MODEL STRUCTURE&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
The repository employs Simon Brown&amp;#039;s C4 model (System Context, Container, Component, &lt;br /&gt;
and Code) documented via PlantUML (diagrams-as-code).&lt;br /&gt;
&lt;br /&gt;
The architecture consists of the following distinct modules / bounded contexts:&lt;br /&gt;
&lt;br /&gt;
1. API (Host Container):&lt;br /&gt;
   - Ultra-thin ASP.NET Core Web API layer.&lt;br /&gt;
   - Responsibilities: accept HTTP requests, delegate authentication/authorization &lt;br /&gt;
     via the UserAccess module, dispatch commands and queries to internal modules, &lt;br /&gt;
     and return HTTP responses.&lt;br /&gt;
   - Contains ZERO business or application logic.&lt;br /&gt;
&lt;br /&gt;
2. UserAccess Module:&lt;br /&gt;
   - Manages user identity, registration validation, authentication, JWT token issuance, &lt;br /&gt;
     roles, and fine-grained permissions.&lt;br /&gt;
&lt;br /&gt;
3. Registrations Module:&lt;br /&gt;
   - Handles the user onboarding pipeline: registration requests, confirmation email &lt;br /&gt;
     flows, and registration verification state machines.&lt;br /&gt;
&lt;br /&gt;
4. Meetings Module (Core Domain):&lt;br /&gt;
   - The heart of the business domain: creation and lifecycle of Meeting Groups, Meetings, &lt;br /&gt;
     Attendees, Waitlists, and Comment threads.&lt;br /&gt;
&lt;br /&gt;
5. Administration Module:&lt;br /&gt;
   - Dedicated workflows for back-office administrators: reviewing, approving, or &lt;br /&gt;
     rejecting meeting group proposals and auditing platform policies.&lt;br /&gt;
&lt;br /&gt;
6. Payments Module:&lt;br /&gt;
   - Financial workflows: subscription fee payments, event entry fees, payer records, &lt;br /&gt;
     and payment confirmation state handling.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. TACTICAL DDD PATTERNS &amp;amp; INTERNAL MODULE ANATOMY&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
Each module is designed with strict boundaries and zero unauthorized coupling:&lt;br /&gt;
&lt;br /&gt;
* High Level of Encapsulation:&lt;br /&gt;
  All internal domain entities, repository implementations, command handlers, and &lt;br /&gt;
  database models are marked with C# &amp;#039;internal&amp;#039; access modifiers. External callers &lt;br /&gt;
  only interact with a very small, public facade interface (e.g., IMeetingsModule).&lt;br /&gt;
&lt;br /&gt;
* Rich Domain Models (Persistence Ignorance):&lt;br /&gt;
  Domain entities are pure POCOs without EF Core or infrastructure dependencies. All &lt;br /&gt;
  business invariants and rules are strictly encapsulated inside Aggregate Roots.&lt;br /&gt;
&lt;br /&gt;
* Combating Primitive Obsession:&lt;br /&gt;
  Strong Value Objects are used throughout (e.g., MeetingId, MemberId, Money, &lt;br /&gt;
  MeetingLimits) instead of raw strings, integers, or GUIDs.&lt;br /&gt;
&lt;br /&gt;
* CQRS (Command Query Responsibility Segregation):&lt;br /&gt;
  - Command Pipeline (Write): Domain-driven mutation handled through MediatR/handlers &lt;br /&gt;
    and Entity Framework Core with strict repository patterns.&lt;br /&gt;
  - Query Pipeline (Read): High-performance, read-only SQL queries projected directly &lt;br /&gt;
    into DTOs using Dapper, completely bypassing domain models and change tracking.&lt;br /&gt;
&lt;br /&gt;
* Asynchronous Inter-Module Communication:&lt;br /&gt;
  Modules NEVER make direct database calls or synchronous method invocations across &lt;br /&gt;
  module boundaries. Inter-module communication is 100% asynchronous, mediated by an &lt;br /&gt;
  Event Bus.&lt;br /&gt;
&lt;br /&gt;
* Reliability: Transactional Outbox &amp;amp; Inbox Patterns:&lt;br /&gt;
  - Outbox Pattern: Integration events are saved into an Outbox table within the SAME &lt;br /&gt;
    local database transaction that mutates aggregate state. A background worker &lt;br /&gt;
    (Quartz.NET) polls the Outbox and dispatches events to the in-memory event bus.&lt;br /&gt;
  - Inbox Pattern: Receiving modules store incoming messages into an Inbox table to &lt;br /&gt;
    guarantee exactly/at-least-once processing and prevent duplicate side-effects.&lt;br /&gt;
&lt;br /&gt;
* Internal Commands:&lt;br /&gt;
  Enables deferred or background execution of internal tasks within a module (e.g., &lt;br /&gt;
  sending notification emails or expiring waitlist holds) with automated retry and &lt;br /&gt;
  error handling.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. TESTING &amp;amp; ARCHITECTURAL GOVERNANCE&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
The project features a rigorous, multi-tier testing strategy:&lt;br /&gt;
* Unit Tests: Pure domain model testing focusing on invariant logic, free from mock &lt;br /&gt;
  overhead or database dependencies.&lt;br /&gt;
* Integration Tests: End-to-end command/query execution tested against a real database &lt;br /&gt;
  environment to ensure queries, mappings, and Outbox dispatchers execute flawlessly.&lt;br /&gt;
* Architecture Tests (NetArchTest): Automated architecture tests that run on build. &lt;br /&gt;
  They enforce modular encapsulation, preventing developers from accidentally adding &lt;br /&gt;
  unauthorized dependencies across module layers.&lt;br /&gt;
&lt;br /&gt;
================================================================================&lt;br /&gt;
[بخش فارسی - راست به چپ (RTL)]&lt;br /&gt;
================================================================================&lt;br /&gt;
&lt;br /&gt;
۱. مقدمه و هدف مخزن (Introduction &amp;amp; Purpose)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
ریپوزیتوری «kgrzybek/modular-monolith-with-ddd» اثر کمیل گژبک (Kamil Grzybek)، یکی &lt;br /&gt;
از برجسته‌ترین و استانداردترین مراجع معماری نرم‌افزار در جامعه توسعه‌دهندگان دات‌نت (.NET) &lt;br /&gt;
و کل اکوسیستم مهندسی نرم‌افزار به شمار می‌رود.&lt;br /&gt;
&lt;br /&gt;
اهداف بنیادین پروژه:&lt;br /&gt;
• ارائه الگویی عملی برای پیاده‌سازی یک معماری یکپارچه ماژولار (Modular Monolith) &lt;br /&gt;
  با کیفیت آماده برای محیط عملیاتی (Production-Ready) به‌جای یک اثبات ایده (PoC) ساده.&lt;br /&gt;
• بهره‌مندی از تمام مزایای میکروسرویس‌ها (نظیر مرزبندی شفاف دامین، استقلال پایگاه‌داده، &lt;br /&gt;
  کاهش وابستگی‌ها و استقلال تیم‌ها) بدون مواجهه با چالش‌ها و هزینه‌های گزاف توزیع‌شدگی &lt;br /&gt;
  (تأخیر شبکه، پیچیدگی تراکنش‌های توزیع‌شده، ناهماهنگی داده‌ها و زیرساخت پیچیده).&lt;br /&gt;
• نمایش پیاده‌سازی حرفه‌ای الگوهای تاکتیکی طراحی دامین‌محور (Domain-Driven Design) و &lt;br /&gt;
  طراحی با قابلیت تست‌پذیری حداکثری (Testable Design).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
۲. شرح دامنه تجاری: پلتفرم مدیریت رویدادها (Meetup Domain)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
این پروژه برای نشان دادن الگوها در شرایط دنیای واقعی، دامنه‌ای ملموس و دارای چالش‌های &lt;br /&gt;
کسب‌وکاری یعنی «سیستم مدیریت رویداد و همایش» (شبیه به پلتفرم بین‌المللی Meetup) را &lt;br /&gt;
پیاده‌سازی کرده است:&lt;br /&gt;
&lt;br /&gt;
قوانین و مفاهیم بیزینس:&lt;br /&gt;
• گروه‌های رویداد (Meeting Groups): اعضا می‌توانند پیشنهاد تشکیل گروه جدید ثبت کنند؛ &lt;br /&gt;
  اما این پیشنهاد تا زمان بازبینی و تأیید توسط مدیران ارشد سیستم فعال نمی‌شود.&lt;br /&gt;
• اشتراک‌ها (Subscriptions): هر گروه باید دارای برگزارکننده‌ای با اشتراک معتبر باشد. &lt;br /&gt;
  هر اشتراک فعال حداکثر ۳ گروه همایش را پوشش می‌دهد.&lt;br /&gt;
• جلسات و رویدادها (Meetings): فقط سازمان‌دهنده گروه می‌تواند جلسه جدید تعریف کند. &lt;br /&gt;
  هر جلسه شامل شرکت‌کنندگان قطعی، انصراف‌دهندگان و لیست انتظار (Waitlist) است.&lt;br /&gt;
• ظرفیت و سهمیه‌ها: جلسات می‌توانند سقف ظرفیت داشته باشند؛ پس از پر شدن ظرفیت، ثبت‌نام‌ها &lt;br /&gt;
  به‌طور خودکار به لیست انتظار منتقل می‌شوند.&lt;br /&gt;
• نقش‌های جلسه: هر شرکت‌کننده می‌تواند نقش عادی یا میزبان (Host) داشته باشد. وجود حداقل &lt;br /&gt;
  یک میزبان برای ویرایش جزئیات و مدیریت لیست افراد الزامی است.&lt;br /&gt;
• هزینه‌ها و مهمانان: امکان تعیین هزینه ورودی برای جلسات وجود دارد و اعضا می‌توانند &lt;br /&gt;
  مهمان همراه بیاورند و هزینه آن‌ها را شخصاً متقبل شوند.&lt;br /&gt;
• نظرات (Comments): ثبت نظر، پاسخ و لایک‌کردن دیدگاه‌ها با توجه به تنظیمات جلسه مدیریت می‌شود.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
۳. ساختار و تفکیک ماژول‌ها بر اساس مدل C4 (Architecture &amp;amp; Modules)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
سیستم با پیروی از متدولوژی مستندسازی C4 (سطوح کانتینر، کامپوننت و کد) و با نمودارهای &lt;br /&gt;
PlantUML مستندسازی شده و دارای تفکیک لایه‌ای زیر است:&lt;br /&gt;
&lt;br /&gt;
۱. ماژول API (لایه وب و میزبانی):&lt;br /&gt;
   - یک لایه بسیار نازک بر بستر ASP.NET Core Web API.&lt;br /&gt;
   - وظایف: دریافت درخواست‌های HTTP، اعتبارسنجی احراز هویت با ماژول دسترسی، ارسال &lt;br /&gt;
     فرمان‌ها و پرس‌وجوها به ماژول‌های داخلی و بازگرداندن پاسخ.&lt;br /&gt;
   - فاقد هرگونه لاجیک تجاری و محاسباتی.&lt;br /&gt;
&lt;br /&gt;
۲. ماژول UserAccess:&lt;br /&gt;
   - مدیریت هویت کاربری، صدور توکن‌های JWT، نقش‌ها (Roles) و مجوزهای ریزدانه (Permissions).&lt;br /&gt;
&lt;br /&gt;
۳. ماژول Registrations:&lt;br /&gt;
   - مدیریت چرخه ثبت‌نام، تایید ایمیل و ماشین وضعیت اعتبارسنجی ثبت‌نام کاربران.&lt;br /&gt;
&lt;br /&gt;
۴. ماژول Meetings (هسته مرکزی دامین):&lt;br /&gt;
   - پیاده‌سازی هسته بیزینس: گروه‌ها، جلسات، ظرفیت‌ها، لیست‌های انتظار و کامنت‌ها.&lt;br /&gt;
&lt;br /&gt;
۵. ماژول Administration:&lt;br /&gt;
   - جریان‌های کاری اختصاصی مدیران پلتفرم جهت بررسی، تأیید یا رد پیشنهادات گروه‌ها.&lt;br /&gt;
&lt;br /&gt;
۶. ماژول Payments:&lt;br /&gt;
   - جریان‌های مالی: پرداخت حق اشتراک برگزارکنندگان و هزینه‌های ورودی رویدادها.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
۴. الگوهای تاکتیکی DDD و معماری داخلی ماژول‌ها (Tactical DDD &amp;amp; Mechanics)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
هر ماژول به عنوان یک واحد خودمختار با رعایت مرزهای نفوذناپذیر طراحی شده است:&lt;br /&gt;
&lt;br /&gt;
• کپسوله‌سازی حداکثری (Strict Encapsulation):&lt;br /&gt;
  تمامی موجودیت‌های دامین، کلاس‌های EF Core، هندلرها و ریپازیتوری‌ها با سطح دسترسی internal &lt;br /&gt;
  تعریف شده‌اند. دنیای خارج فقط از طریق یک اینترفیس پابلیک بسیار کوچک (مانند IMeetingsModule) &lt;br /&gt;
  با ماژول ارتباط برقرار می‌کند.&lt;br /&gt;
&lt;br /&gt;
• مدل‌های غنی دامنه و بی‌خبری از ذخیره‌سازی (Persistence Ignorance):&lt;br /&gt;
  موجودیت‌های دامین کلاس‌های خالص (POCO) هستند و هیچ وابستگی به زیرساخت یا پایگاه‌داده ندارند. &lt;br /&gt;
  تمام اینوریانت‌ها (Invariants) و قوانین درون ریشه‌های تجمیع (Aggregate Roots) حفظ می‌شوند.&lt;br /&gt;
&lt;br /&gt;
• مقابله با وسواس نوع‌های بدوی (Primitive Obsession):&lt;br /&gt;
  استفاده گسترده از Value Objectها به‌جای انواع داده‌ای خام نظیر string یا Guid.&lt;br /&gt;
&lt;br /&gt;
• تفکیک دستورات و پرس‌وجوها (CQRS):&lt;br /&gt;
  - مسیر تغییرات (Write): با بهره‌گیری از MediatR و Entity Framework Core برای تضمین صحت کامل داده‌ها.&lt;br /&gt;
  - مسیر خواندن (Read): با اجرای مستقیم کوئری‌های خام و با بازدهی بسیار بالای SQL توسط Dapper &lt;br /&gt;
    مستقیماً روی DTOها، بدون درگیر کردن دامین مدل یا Change Tracker.&lt;br /&gt;
&lt;br /&gt;
• ارتباط ناهمگام میان ماژول‌ها (Asynchronous Communication):&lt;br /&gt;
  هیچ ماژولی حق فراخوانی مستقیم متدها یا پایگاه‌داده ماژول دیگر را ندارد. کلیه تبادلات منحصراً &lt;br /&gt;
  از طریق انتشار رویداد روی Event Bus صورت می‌پذیرد.&lt;br /&gt;
&lt;br /&gt;
• تضمین تراکنش‌ها با الگوهای Outbox و Inbox:&lt;br /&gt;
  - الگوی Outbox: رویدادهای یکپارچه‌سازی در همان تراکنش محلی دیتابیس در جدول Outbox ذخیره &lt;br /&gt;
    می‌شوند و پردازشگر پس‌زمینه (Quartz.NET) آنها را بدون از دست رفتن اطلاعات منتشر می‌کند.&lt;br /&gt;
  - الگوی Inbox: دریافت پیام‌ها در جدول Inbox ذخیره می‌شود تا از پردازش تکراری رویدادها &lt;br /&gt;
    جلوگیری شده و ضمانت پردازش حداقل یک‌باره (At-Least-Once) حاصل شود.&lt;br /&gt;
&lt;br /&gt;
• فرمان‌های داخلی (Internal Commands):&lt;br /&gt;
  انجام پردازش‌های زمان‌بندی‌شده، ارسال ایمیل‌ها یا کارهای پس‌زمینه درون هر ماژول به شکل مطمئن &lt;br /&gt;
  با قابلیت تلاش مجدد (Retry) خودکار.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
۵. استراتژی تست و نظارت خودکار بر معماری (Testing &amp;amp; Arch Tests)&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
• تست‌های واحد (Unit Tests): متمرکز بر اعتبارسنجی لاجیک خالص دامین مدل، بدون وابستگی به دیتابیس &lt;br /&gt;
  یا شبیه‌سازی‌های زائد (Mocking).&lt;br /&gt;
• تست‌های یکپارچگی (Integration Tests): تست تراکنش‌های واقعی، دیتابیس و اجرای کامل فرآیندها.&lt;br /&gt;
• تست‌های خودکار معماری (NetArchTest): آزمون‌های کدی که نقض قوانین ماژولار، وابستگی‌های غیرمجاز و &lt;br /&gt;
  نشت کپسوله‌سازی را در زمان Build شناسایی و رد می‌کنند.&lt;br /&gt;
================================================================================&lt;/div&gt;</summary>
		<author><name>Mkaravi</name></author>
	</entry>
</feed>