PRODUCTION-GRADE

The Modular Monolith

A hardened ERP platform. Designed with Clean Architecture, Domain-Driven Design, and a scalable Event-Driven backbone. Not a demoβ€”this runs real businesses.

πŸ‘₯

Customer

Aggregates, Payments, Tax

🧾

Invoice

Billing, AR, Schedules

πŸ“¦

Product

Inventory, Pricing, UoM

🏭

Supplier

Contracts, Procurement

Infrastructure Core

EF Core β€’ RabbitMQ β€’ Redis β€’ Hangfire β€’ ElasticSearch

Technology Landscape

A comprehensive, battle-tested stack.

Core Stack

  • .NET 9 / C# 12
  • Clean Architecture
  • CQRS + MediatR
  • Domain Events

Data & Search

  • SQL Server (Docker)
  • MongoDB (GridFS)
  • Redis (Cache)
  • Elasticsearch

Messaging & Jobs

  • RabbitMQ (Sagas)
  • Hangfire (Jobs)
  • SignalR (Real-time)
  • Quartz (Scheduling)

Frontend

  • Blazor WASM
  • .NET MAUI
  • MudBlazor
  • ReactiveUI

Real-World Workflows

Example: AI-Powered Medical Image Processing.

πŸ“

1. Upload to GridFS

User uploads a large video/image (e.g. X-Ray). File is streamed to MongoDB GridFS with tuned chunking.

Blazor FastEndpoints MongoDB
⚑

2. Domain Event Trigger

MediaUploadedEvent is raised. RabbitMQ publishes message to the AI processing queue.

MediatR RabbitMQ
πŸ€–

3. AI Analysis

External AI microservice consumes message, processes file (tagging, diagnostics), and stores metadata.

Python/Microservice GPU
πŸ””

4. Real-Time Notification

Results ready. Domain event broadcast via SignalR. User sees "Analysis Complete" toast instantly.

SignalR WebSockets
PRESENTATION LAYER

Shared Client Intelligence

We don't duplicate logic. Blazor and MAUI share the exact same HTTP Client Services and DTO Contracts.

  • βœ“ Orchestrator Pattern: Coordinates state, validation, and API calls.
  • βœ“ ReactiveUI: Subject<Unit> throttling prevents UI render storms.
  • βœ“ Optimistic Locking: SignalR warns if another user is editing the same invoice.
InvoiceMasterOrchestrator.cs C#
01
public class InvoiceMasterOrchestrator
02
{
03
  // Reactive Refresh Pipeline
04
  public IObservable<Unit> RefreshRequested => _refreshSubject
05
    .Throttle(TimeSpan.FromMilliseconds(300));
06

07
  // Shared Client Service
08
  public async Task SaveAsync()
09
  {
10
    var res = await _client.UpdateInvoiceAsync(_dto);
11
    if (res.IsSuccess) _signalR.NotifyUnlocked(_dto.Id);
12
  }
13
}