Overview
Guard clauses are static methods that validate inputs and throw exceptions when constraints are violated. They are used throughout entity constructors and public methods to ensure data integrity. Namespace:SGRH.Domain.Common
Source: ~/workspace/source/SGRH.Domain/Common/Guard.cs
Guard Methods
TheGuard static class provides validation methods for common scenarios:
Guard Details
AgainstNullOrWhiteSpace
- Value is not null or whitespace
- Value length does not exceed
maxLength
ValidationExceptionwith descriptive message
AgainstNull
ValidationExceptionif value is null
AgainstOutOfRange (Integer)
ValidationExceptionifvalue <= minExclusive
AgainstOutOfRange (Decimal)
ValidationExceptionifvalue <= minExclusive
AgainstInvalidDateRange
ValidationExceptionifstart >= end
Validation Patterns
Constructor Validation
All entity constructors validate inputs before assignments:- Entities are always valid after construction
- No partially constructed invalid objects
- Clear failure points with descriptive errors
Update Method Validation
Update methods re-validate all inputs:Policy Parameter Validation
Methods accepting policies validate the policy reference:Conditional Validation
Some validations are conditional based on context:Exception Types
ValidationException
Thrown by Guard clauses for input validation failures:- Invalid inputs (null, empty, out of range)
- Constraint violations (max length, date ranges)
- Precondition failures
BusinessRuleViolationException
Thrown for business logic violations:- State transition violations (e.g., confirming a canceled reservation)
- Editability rules (e.g., modifying a confirmed reservation)
- Complex business constraints
ConflictException
Thrown when operations conflict with existing data:- Duplicate entries (e.g., adding same room twice)
- Resource conflicts (e.g., room already reserved)
NotFoundException
Thrown when referenced entities don’t exist:- Entity not found by ID
- Child entity not found in collection
Best Practices
Validate Early
Validate Early
- Guards at the top of methods, before any logic
- Fail fast before side effects
- Clear separation between validation and business logic
Use Descriptive Names
Use Descriptive Names
Use Benefits:
nameof() for parameter names in error messages:- Refactoring-safe (renames update automatically)
- Consistent error messages
- Clear identification of problematic parameter
Validate All Inputs
Validate All Inputs
Every public method and constructor should validate all inputs:
Choose Appropriate Exceptions
Choose Appropriate Exceptions
ValidationException: Input/parameter problemsBusinessRuleViolationException: Business logic violationsConflictException: Duplicate/conflicting dataNotFoundException: Missing referenced entities
Consistent Validation
Consistent Validation
Apply the same validations in constructors and update methods:
Testing Guards
Unit Test Examples
Related Documentation
- Cliente - Guard usage examples
- Reserva - Complex validation patterns
- Habitacion - Conditional validation
- Reservation Policies - Business rule validation