Skip to content

Pattern Library — 57 Design Patterns for .NET

A catalogue of design patterns used in the Granit framework, organized by category.

Each pattern documents the general concept, how it is implemented in Granit, and references to the actual source files where the pattern is applied.

PatternDescription
Module SystemTopological loading with [DependsOn]
Hexagonal ArchitecturePorts and Adapters for infrastructure decoupling
Layered ArchitectureDomain / Application / Infrastructure separation
Middleware PipelineDual ASP.NET Core + Wolverine pipeline
Event-DrivenIDomainEvent (local) + IIntegrationEvent (durable)
REPRMinimal API Request-Endpoint-Response
CQRSIReader / IWriter separation, ArchUnitNET enforcement
Vertical Slice ArchitectureFeature-organized code, per-use-case slices
Aggregate RootDDD aggregate roots for business invariants and domain events
Anti-Corruption LayerIsolation of Keycloak, S3, Brevo, FCM via internal DTOs
PatternDescription
Multi-Tenancy3 isolation strategies, soft dependency, async propagation
Feature FlagsMulti-level resolution Tenant to Plan to Default
Transactional OutboxAtomic event publishing via Wolverine Outbox
IdempotencyStripe-style HTTP idempotency with state machine
Pre-Signed URLDirect-to-cloud S3 upload/download
Sidecar / BehaviorContext propagation via Wolverine Behaviors
Circuit Breaker and RetryStandard resilience + Wolverine RetryWithCooldown
Cache-AsideFusionCache L1/L2 with native stampede protection
Rate LimitingPer-tenant rate limiting with dynamic quotas
Saga / Process ManagerGDPR export, import/export orchestrators
Fan-OutWolverine cascade for notifications and webhooks
Claim CheckSoft dependency IClaimCheckStore for large payloads
Bulkhead IsolationQueue isolation, parallelism, tenant quotas
PatternDescription
StrategyTenantIsolationStrategy, IBlobKeyStrategy, IStringEncryptionProvider
Chain of ResponsibilityTenantResolverPipeline, blob validation
CommandSendWebhookCommand, RunMigrationBatchCommand
Template MethodGranitModule lifecycle, GranitValidator
State MachineIdempotencyState, BlobStatus
Observer / EventWolverine implicit event subscription
MediatorWolverine message bus
Null ObjectNullTenantContext, NullCacheValueEncryptor
PatternDescription
Factory MethodVaultClientFactory, DbContext tenant factories
SingletonAsyncLocal singletons, NullTenantContext.Instance
BuilderFluent AddGranit*() extensions
PatternDescription
AdapterS3BlobClient, MailKitSmtpTransport
DecoratorEncryptingFusionCacheSerializer, CachedLocalizationOverrideStore
ProxyFilterProxy for EF Core, Interceptors
FacadeDefaultBlobStorage, GranitExceptionHandler
CompositeAuditable entity hierarchy
PatternDescription
RepositoryStore interfaces + EF Core / InMemory implementations
Soft DeleteISoftDeletable + SoftDeleteInterceptor (GDPR)
Data FilteringIDataFilter with ImmutableDictionary AsyncLocal
Unit of WorkImplicit DbContext + interceptor chain
SpecificationQueryDefinition whitelist-first, expression trees
PatternDescription
Scope / Context Managerusing pattern for context restoration
Copy-on-WriteImmutableDictionary for thread-safe state
Double-Check LockingAnti-stampede for token caching and singletons
PatternDescription
Expression TreesDynamic EF Core query filter construction
Marker InterfaceISoftDeletable, IMultiTenant, IDomainEvent
Options Pattern93 Options classes, ValidateOnStart
PatternDescription
Claims-Based IdentityJWT Keycloak + dynamic RBAC
Guard ClauseSystematic fail-fast, semantic exceptions
PatternDescription
Retrieval-Augmented GenerationVector retrieval + LLM grounding (AI.VectorData)
AI WorkspaceNamed, per-tenant provider configuration (IAIChatClientFactory)
Graceful AI FallbackTimeout + deterministic baseline (QueryEngine.AI, DataExchange.AI)
Structured OutputType-safe LLM response via JSON schema (CompleteAsync<T>)
PatternDescription
Granit Variants10 hybrid patterns unique to Granit