INTRODUCTION · COREeQuantic.CoreThe eQuantic Core library is the foundation of the whole ecosystem, providing the essential abstractions and base functionality for building robust, scalable applications.
Overview
It implements the architectural patterns the rest of the ecosystem assumes — Domain-Driven Design, Clean Architecture, SOLID — so a project starts from a shape rather than from a folder.It is the most used library we publish, and the one every other package builds on: standardised interfaces for repositories, services and domain entities.
Install it
shell
dotnet add package eQuantic.Core
What it does
Repository abstractionsGeneric interfaces for data access, with CRUD, paging and composable specifications.
Domain entitiesBase types for entities, aggregates and value objects, following DDD.
SpecificationsThe specification pattern, for queries that are complex once and reusable after.
Domain eventsAn event system for talking between bounded contexts, and for side effects that belong outside the aggregate.
Value objectsBase types for value objects, with validation and comparison by value rather than by reference.
Repository abstractionsGeneric interfaces for data access, with CRUD, paging and composable specifications.
Domain entitiesBase types for entities, aggregates and value objects, following DDD.
SpecificationsThe specification pattern, for queries that are complex once and reusable after.
Domain eventsAn event system for talking between bounded contexts, and for side effects that belong outside the aggregate.
Value objectsBase types for value objects, with validation and comparison by value rather than by reference.
Quick start
Basic setup — Register the core services in your project.
C#
public void ConfigureServices(IServiceCollection services){ services.AddEQuantic() .AddDataAccess() .AddRepositories();}
Define an entity — Your domain types inherit the base, which gives them identity and an event buffer.
C#
public class Product : Entity<int>{ public string Name { get; private set; } public decimal Price { get; private set; } public Product(string name, decimal price) { Name = name; Price = price; } public void UpdatePrice(decimal newPrice) { Price = newPrice; AddDomainEvent(new PriceUpdatedEvent(Id, newPrice)); }}
Use a repository — Take the interface, not the implementation — and pass a specification instead of writing the query twice.
C#
public class ProductService{ private readonly IRepository<Product> _repository; public ProductService(IRepository<Product> repository) { _repository = repository; } public async Task<Product> GetByIdAsync(int id) { return await _repository.GetByIdAsync(id); } public async Task<IEnumerable<Product>> GetActiveProductsAsync() { var spec = new ActiveProductsSpecification(); return await _repository.GetAsync(spec); }}
Public surface
NAMESPACE
PUBLIC SURFACE
IRepository<T>
The generic repository contract, with the basic CRUD operations.
Entity<TKey>
The base class for a domain entity with a typed key.
ISpecification<T>
The contract for implementing the specification pattern.
Prefer reading code?
Every package is MIT and public, and the samples are copy-paste ready.
Ready to ship something real?
Book a 30-minute discovery call. We'll tell you within the hour whether we're the right partner — or who is.
Ready to ship something real?
Book a 30-minute discovery call. We'll tell you within the hour whether we're the right partner — or who is.
© 2026 eQuantic Tech. All rights reserved.