Dynamic Data API Provider. You control everything. We handle the boilerplate.
DDAP automatically generates REST, GraphQL, and gRPC APIs from your database schemaβbut without forcing any decisions on you.
Unlike other frameworks that lock you into specific libraries, databases, or patterns, DDAP provides infrastructure only. You choose:
- ποΈ Your database (SQL Server, MySQL, PostgreSQL, SQLite, or custom)
- π§ Your ORM (Dapper or Entity Framework)
- π¨ Your serializer (System.Text.Json, Newtonsoft.Json, or any)
- π Your API style (REST, GraphQL, gRPC, or all three)
DDAP discovers your schema, generates base types, and gets out of your way.
| What DDAP Provides | What You Control |
|---|---|
| β Entity discovery from database | π― Database type (SQL Server, MySQL, etc.) |
| β Metadata mapping (tables, columns, keys) | π― ORM choice (Dapper or Entity Framework) |
| β Base API types (controllers, queries, services) | π― Serialization library (any JSON library) |
| β Auto-Reload infrastructure | π― Auto-Reload configuration (when, how) |
| β Hooks and lifecycle callbacks | π― GraphQL configuration (complete control) |
| β Partial classes for extension | π― REST configuration (formatters, routing) |
β
Project templates (dotnet new) |
π― gRPC configuration (services, options) |
| π― Everything else! |
βββββββββββββββββββββββββββββββββββββββ
β π« Opinionated Frameworks β
β β Force Newtonsoft.Json β
β β Hardcode XML/YAML formatters β
β β Database-specific packages β
β β Hidden configurations β
β β Lock you into patterns β
βββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββ
β β
DDAP - Developer in Control β
β β
You choose serializer β
β β
You configure formatters β
β β
Single Dapper, ANY database β
β β
Everything explicit β
β β
You own the architecture β
βββββββββββββββββββββββββββββββββββββββ
dotnet add package Ddap.Core
dotnet add package Ddap.Data.Dapper # OR Ddap.Data.EntityFramework
dotnet add package Ddap.GraphQL # Optional
dotnet add package Ddap.Rest # Optional
dotnet add package Ddap.Grpc # Optionalusing Microsoft.Data.SqlClient;
var builder = WebApplication.CreateBuilder(args);
// YOU choose the database connection
builder.Services.AddDdap()
.AddDapper(() => new SqlConnection(
builder.Configuration.GetConnectionString("DefaultConnection")
))
.AddRest()
.AddGraphQL(graphql =>
{
// YOU configure HotChocolate
graphql
.AddFiltering()
.AddSorting()
.AddProjections();
});
var app = builder.Build();
app.MapControllers();
app.MapGraphQL();
app.Run();- REST:
GET /api/entity - GraphQL:
POST /graphql { entities { name } }
dotnet new install Ddap.Templates
dotnet new ddap-api --name MyApi
cd MyApi
dotnet run- Dapper: Works with ANY
IDbConnection(SQL Server, MySQL, PostgreSQL, SQLite, Oracle, etc.) - Entity Framework: Use your existing
DbContext
- REST: Standard HTTP/JSON endpoints with full controller customization
- GraphQL: Powered by HotChocolate, fully configurable
- gRPC: High-performance RPC, configurable services
Automatically reloads database schema after idle periods:
- β 3 Strategies: InvalidateAndRebuild, HotReloadIncremental, RestartExecutor
- β 3 Behaviors: ServeOldSchema, BlockRequests, QueueRequests
- β 3 Detection Methods: AlwaysReload, CheckHash, CheckTimestamps
- β Lifecycle Hooks: OnBeforeReloadAsync, OnAfterReloadAsync
options.AutoReload = new AutoReloadOptions
{
Enabled = true,
IdleTimeout = TimeSpan.FromMinutes(5),
Strategy = ReloadStrategy.InvalidateAndRebuild,
Behavior = ReloadBehavior.ServeOldSchema,
Detection = ChangeDetection.CheckHash
};dotnet new ddap-api --database-provider dapper --database-type mysql --api-providers "rest,graphql"- No forced dependencies
- No hidden configurations
- No magic behavior
- You configure everything
// Extend via partial classes
namespace Ddap.Rest;
public partial class EntityController
{
[HttpGet("custom")]
public IActionResult Custom() => Ok("Your endpoint");
}βββββββββββββββββββββββββββββββββββββββββββββ
β Your Application β
β (Controllers, Services, Business Logic) β
βββββββββββββββββ¬ββββββββββββββββββββββββββββ
β
βββββββββββββββββΌββββββββββββββββββββββββββββ
β DDAP Core Infrastructure β
β β
Entity Discovery β
β β
Metadata Mapping β
β β
Base Type Generation β
β β
Auto-Reload Management β
β β
Lifecycle Hooks β
βββββββββββββββββ¬ββββββββββββββββββββββββββββ
β
βββββββββββββββββΌββββββββββββββββββββββββββββ
β Your Configuration Choices β
β π― Database: SQL Server / MySQL / etc. β
β π― ORM: Dapper / Entity Framework β
β π― Serializer: System.Text.Json / etc. β
β π― APIs: REST / GraphQL / gRPC β
βββββββββββββββββββββββββββββββββββββββββββββ
| Package | Description | Status |
|---|---|---|
Ddap.Core |
Core abstractions and infrastructure | β Stable |
Ddap.Data.Dapper |
Dapper provider (database-agnostic) | β Stable |
Ddap.Data.EntityFramework |
Entity Framework Core provider | β Stable |
Ddap.Rest |
REST API endpoints | β Stable |
Ddap.GraphQL |
GraphQL API (HotChocolate) | β Stable |
Ddap.Grpc |
gRPC services | β Stable |
Ddap.Aspire |
.NET Aspire orchestration | β Stable |
Ddap.Templates |
Project templates | β Stable |
- π― Philosophy - Developer in Control
- π Getting Started - Step-by-step guide
- ποΈ Database Providers - Dapper vs EF
- π API Providers - REST, GraphQL, gRPC
- π Auto-Reload - Schema refresh system
- π¦ Templates -
dotnet newguide - ποΈ Architecture - How it works
- π§ Advanced - Extensibility
- π Troubleshooting - Common issues
Contributions welcome! See CONTRIBUTING.md
MIT License - see LICENSE
If DDAP helps you, please star the repo! π
Built with β€οΈ by developers who believe in control, not constraints.