Diagrams

Visual overviews of how Crispy Waffle is put together. Each diagram is an SVG file stored in docs/images/diagrams; click any diagram to open it at full size.

Diagram What it shows
Package architecture The core package, its facades, and which integration packages plug into which extension point
Logging pipeline How a log call reaches every registered provider, and how exceptions are handled
Caching The write path (all repositories) and the read path (priority order, promotion to memory)
Events and commands One-to-many event dispatch versus one-to-one command dispatch through the service locator
Background jobs The CrispyWaffle.BackgroundJobs pipeline and the job lifecycle with retries

Package architecture

The core CrispyWaffle package exposes static facades such as LogConsumer, CacheManager and ServiceLocator. Integration packages implement the core extension points (ILogProvider, ICacheRepository, ITelemetryClient, IExceptionHandler). Packages that open connections to external services also reference CrispyWaffle.Configuration. Each module and package has its own page under Core Modules and Integration Packages. BackgroundJobs and HttpClient are standalone and build on Microsoft.Extensions.*.

CrispyWaffle package architecture

Logging pipeline

LogConsumer resolves a category from the calling namespace, checks every ILogFilter for each provider, and writes to every registered ILogProvider that passes. Exceptions sent to LogConsumer.Handle go to the configured IExceptionHandler. The default handler records telemetry and writes to its own provider list (AddLogProvider<T>(ExceptionLogType)), separate from LogConsumer's providers.

See the Logging guide for usage.

Logging pipeline

Caching

CacheManager.SetAsync writes to every repository in parallel. CacheManager.GetAsync tries repositories in priority order and returns the first hit; a value found outside memory is copied into MemoryCacheRepository in the background.

See the Caching guide for usage.

Caching write and read paths

Events and commands

EventsConsumer finds every IEventHandler<TEvent> implementation by scanning the loaded assemblies and calls each one in discovery order. CommandsConsumer resolves exactly one ICommandHandler<TCommand, TResult> and returns its result. Both look up handlers through the ServiceLocator.

See the Events, Commands and Service Locator guides for usage.

Events and commands dispatch

Background jobs

JobDispatcher saves a pending job to an IJobStore (in memory or EF Core). BackgroundWorker loops fetch due jobs, find the handler registered under the job's name, and run it in a DI scope. Failed jobs are retried with exponential backoff until MaxAttempt is reached.

See the BackgroundJobs package for usage.

Background jobs pipeline and lifecycle