Repository navigation
5. Architecture and solution structure
This page documents the current repository shape and runtime architecture. It is intended for developers maintaining or extending Signals.
Signals is organized around processes. Application code defines process classes, and Signals supplies the common execution infrastructure around them:
- A host loads required configuration objects.
- A bootstrap configuration registers aspect providers and core framework services.
- Signals scans supplied assemblies for process classes and
[Export]dependencies. - Processes are created by the configured DI container.
- A mediator executes processes through the framework execution pipeline.
- Optional providers add logging, auditing, caching, localization, storage, communication channels, authorization, scheduling, error handling, security, and benchmarking.
The core abstractions are intentionally provider-neutral. Concrete provider packages live in src-extensibility.
The repository contains three solution files:
-
src/00 Solution/Signals.sln: main framework contracts, core libraries, and hosting packages. -
src-extensibility/00 Solution/Signals.Extensibility.sln: main framework, provider packages, core extensions, and tests. -
src/00 Solution/Signals.Debugging.sln: main framework, selected provider packages, and demo clients for debugging.
-
Signals.Core.Common: cross-cutting helpers for serialization, reflection, strings, dates, cryptography, IO, SMTP, URLs, MIME types, and related utility code. -
Signals.Core: process models, process discovery, mediator, execution pipeline, validation/specification support, result types, core configuration, authentication/authorization attributes, critical error notification, benchmarking wrapper, and HTTP-neutral context abstractions.
src/05 Aspects contains provider contracts and shared models:
Signals.Aspects.DISignals.Aspects.ConfigurationSignals.Aspects.LoggingSignals.Aspects.AuditingSignals.Aspects.CachingSignals.Aspects.LocalizationSignals.Aspects.StorageSignals.Aspects.CommunicationChannelsSignals.Aspects.AuthSignals.Aspects.BackgroundProcessingSignals.Aspects.ErrorHandlingSignals.Aspects.SecuritySignals.Aspects.Benchmarking
src-extensibility/05 Aspects contains concrete implementations:
- DI: Autofac, DotNetCore, SimpleInjector
- Configuration: File, MsSql
- Logging: NLog, Serilog
- Auditing: AuditNET
- Caching: InMemory, Redis
- Localization: File, Database
- Storage: Azure, Database, File
- Communication channels: MsSql, ServiceBus
- Auth: NetCore
- Background processing: FluentScheduler
- Error handling: Polly
- Security: Database
- Benchmarking: Database
-
Signals.Core.Web: ASP.NET Core integration, request dispatch, API process route matching, custom content handlers, model binding, response handlers, response headers, CORS/CSP attributes, and output caching. -
Signals.Core.Background: background bootstrap for distributed process subscribers, recurring process scheduling, recurring task logs, and startup notification emails.
src-extensibility/10 Core Extensions contains:
-
Signals.Core.Extensions.Export: CSV, Excel, and PDF export process helpers. -
Signals.Core.Extensions.Import: Excel import process helpers.
See Import and export extensions for usage examples.
src/20 Clients contains sample applications:
-
Signals.Clients.WebApi: ASP.NET Core demo host using Autofac, file configuration, in-memory cache, file localization, ServiceBus channel configuration, and Signals web middleware. -
Signals.Clients.BackgroundWorker: hosted background worker using background bootstrap, Autofac, in-memory cache, file localization, and FluentScheduler. -
Signals.Clients.Processes: shared demo distributed process assembly.
Foreground process execution uses this handler order:
- Authentication
- Authorization
- Guards
- Error logging
- Auditing
- Error managing
- Critical process notifying
- Process execution
Background distributed execution uses this handler order:
- Error logging
- Auditing
- Error managing
- Critical process notifying
- Distributed
Workexecution
Business process execution then calls:
AuthValidateHandle
Distributed process foreground execution calls Auth, Validate, Handle, then Map, and publishes a message unless CancelDistributedExecution() was called.
Recurring process execution calls ShouldExecute() and then Sync(). NoOverlapRecurringProcess checks the recurring task log provider before running.
Recurring processes are scheduled by the background host, but the current wrapper executes them through the normal foreground process executor. Distributed Work execution uses the shorter background pipeline.
UseSignals() runs WebMediator.Dispatch() as ASP.NET Core middleware. The current dispatcher:
- handles
/api/specthroughDocsHandler; - finds API processes through route, type, and HTTP method filters;
- maps
HEADandOPTIONSto header/metadata responses; - binds
GETfrom query string andPOSTfrom request body by default; - executes matching API processes through the foreground pipeline;
- writes JSON, XML, native, file, or failure responses through result handlers.
Known limitation: the dispatcher currently executes only GET and POST process calls. PUT, PATCH, and DELETE exist in SignalsApiMethod and OpenAPI mapping but are not executed by ExecuteGetOrPostMethod.
Configuration objects inherit from BaseConfiguration<T> and are activated by calling UseProvider(...).
Required framework configuration:
- All hosts:
ApplicationConfiguration - Web hosts:
WebApplicationConfiguration - Background hosts:
BackgroundApplicationConfiguration
Provider behavior:
- File configuration reads JSON from disk and validates with data annotations. It does not support updates.
- MsSql configuration auto-creates the configuration table/key rows, validates loaded JSON, supports reload, and supports updates.
Most framework projects currently target net10.0 and declare <Version>4.0.0</Version>.
The Azure pipeline:
- triggers on
master; - restores all
**/*.csproj; - packs all
**/*.csprojusingpackageVersionfrom the environment; - pushes generated packages to the external NuGet feed named
Nuget.
Needs confirmation:
- Release project files still reference internal
Signals.*packages with version3.0.*while the projects are versioned4.0.0. - Demo client projects are not consistently marked
IsPackable=false, so the current**/*.csprojpack pattern may try to package more than library/provider projects.
-
dotnet restorecurrently exits non-zero for both main solution files because some solution/project references point at11 ErrorHandlingwhile the actual project path is11 Error handling. -
DocsHandlerassumes anICacheprovider is configured. -
WebMediatoronly executesGETandPOSTprocess requests. - Distributed processing requires compatible process and DTO assemblies in both foreground and background deployments.