Memoria is built around a small set of abstractions and providers that implement them. The core ships with in-memory or no-op defaults; you replace each provider with a real one only when you need it.
| Concern | Abstraction | Providers |
|---|---|---|
| Storage | IDomainService |
Entity Framework Core · + Identity · Cosmos DB · Cosmos InMemory |
| Messaging | IMessagingProvider |
Azure Service Bus (+ InMemory) · RabbitMQ (+ InMemory) |
| Caching | ICachingProvider |
In-memory · Redis |
| Validation | IValidationProvider |
FluentValidation |
For storage, messaging, and caching, Memoria ships dedicated InMemory packages (Memoria.EventSourcing.Store.Cosmos.InMemory, Memoria.Messaging.ServiceBus.InMemory, Memoria.Messaging.RabbitMq.InMemory). These let you run integration tests and local development without standing up the real backing service. The same IDomainService / IMessagingProvider contract is honored — your application code is unchanged between test and production.
jsonb event data → Entity Framework Core + the Npgsql companion package so eventPropertyFilter translates to the @> containment operator.