Overview
The Infrastructure layer implements interfaces defined in the Application layer. It contains persistence logic (Entity Framework Core), messaging (NATS), external API clients (Binance, Alpaca), and other technical concerns.Database Context
AppDbContext
EF Core implementation of IAppDbContext.- PostgreSQL with enum support
- UUID extension for GUID generation
- Auto-applies entity configurations
- Multiple candle timeframes for charts
Entity Configurations
PriceRuleConfiguration
Configures the PriceRule entity mapping.- Auto-generated UUIDs at database level
- PostgreSQL enum mapping
- Query filter for soft deletes
- Timestamp defaults with
now()
Interceptors
AuditableEntityInterceptor
Automatically sets audit timestamps and dispatches domain events.- Audit timestamps: Automatically set CreatedAt, ModifiedAt
- Soft deletes: Convert DELETE to UPDATE with DeletedAt
- Domain events: Publish events via MediatR before save
- Idempotency: Ensures events dispatched only once
Messaging Infrastructure
NatsService
Implements IPubSub using NATS JetStream for reliable messaging.- JetStream: Persistent, reliable message delivery
- Auto-ack: Messages acknowledged after processing
- Stream creation: Auto-creates notification stream
- JSON serialization: Camel case for consistency
- Subject filtering: Optional filtering in subscriptions
- Publishing price rule triggers
- Distributing real-time price updates
- Coordinating between microservices
Dependency Injection
Infrastructure Services Registration
- PostgreSQL: Snake case naming, enum mapping
- NATS: Singleton pub/sub service
- Refit: HTTP clients for Binance and Alpaca APIs
- Rate limiting: Policy handlers for external APIs
- Interceptors: Audit and domain event handling
Database Features
Snake Case Naming Convention
PriceRule→price_ruleLastTriggeredAt→last_triggered_at
PostgreSQL Enums
Soft Deletes
Global query filter prevents deleted records from appearing in queries:External Service Clients
Binance WebSocket
Real-time price streaming from Binance.Binance REST API
Historical data and exchange info via Refit.Alpaca News API
Crypto news data with authentication headers.Configuration Settings
Connection String Handling
Supports both development and production environments:URI to Connection String Conversion
Parses PostgreSQL URIs for cloud deployments:Best Practices
Repository Pattern
PriceSignal uses DbContext directly instead of repositories because:- EF Core already implements Unit of Work
- IQueryable provides flexible querying
- Less abstraction overhead
- Better integration with HotChocolate GraphQL
Transaction Management
Domain events dispatched within the same transaction:- SaveChanges begins transaction
- Interceptor updates audit fields
- Interceptor publishes domain events
- All changes committed or rolled back together
Next Steps
- Learn about Domain Layer entities
- See Application Layer business logic
- Explore GraphQL Layer for API queries