IReservaDomainPolicy interface defines the contract for enforcing complex business rules in the reservation domain. It acts as a bridge between domain entities and application/infrastructure layers, enabling validation and data retrieval without violating domain model integrity.
Overview
Reservation policies encapsulate business logic that requires external data or complex queries. TheReserva aggregate delegates to these policies to:
- Validate room availability and maintenance schedules
- Determine applicable pricing based on seasons and categories
- Enforce service availability rules
- Ensure business rule consistency
SGRH.Domain.Abstractions.Policies
Source: ~/workspace/source/SGRH.Domain/Abstractions/Policies/IReservaDomainPolicy.cs
Policy Interface
Policy Methods
GetTemporadaId
int: Season ID if a season covers the datenull: If no season is defined for that date (uses base pricing)
EnsureHabitacionDisponible
- habitacionId: Room to check
- fechaEntrada: Check-in date
- fechaSalida: Check-out date
- reservaId: Current reservation ID (null for new reservations)
- Excludes the current reservation (allows date changes)
- Only checks
Confirmadareservations - Uses date overlap logic
EnsureHabitacionNoEnMantenimiento
- Checks historical maintenance records
- Handles open maintenance periods (
FechaFin = null) - Prevents reservations conflicting with scheduled maintenance
GetTarifaAplicada
- Seasonal rate from
TarifaTemporadaif available - Base rate from
CategoriaHabitacion.PrecioBaseas fallback
EnsureServicioDisponibleEnTemporada
- servicioAdicionalId: Service to validate
- temporadaId: Target season (null = no season restriction)
GetPrecioServicioAplicado
- Room 101: Standard category → Service price $20
- Room 201: Suite category → Service price $35
Integration with Reserva Aggregate
Policy Injection
Methods requiring validation receive the policy as a parameter:Method Flow Examples
Adding a Room
Adding a Room
Changing Dates
Changing Dates
Adding a Service
Adding a Service
Policy Implementation
The interface is typically implemented in the Application or Infrastructure layer:Design Benefits
Domain Model Purity
Domain Model Purity
- Domain entities don’t directly access repositories
- No infrastructure dependencies in domain layer
- Enables unit testing with mock policies
- Clear separation of concerns
Business Rule Centralization
Business Rule Centralization
- Complex rules encapsulated in policy implementations
- Consistent validation across application
- Easy to modify business logic without changing entities
- Supports multiple policy implementations (e.g., different pricing strategies)
Testability
Testability
Performance Optimization
Performance Optimization
Policy implementations can:
- Use caching for frequently accessed data (seasons, categories)
- Batch queries for multiple validations
- Optimize database queries with EF Core includes
- Use compiled queries for hot paths
Related Documentation
- Reserva - Aggregate root using policies
- Habitacion - Room entity and state management
- ServicioAdicional - Service availability
- TarifaTemporada - Seasonal pricing
- Validation Guards - Input validation