Apply Clean Architecture layering and dependency rules (Domain, Application, Infrastructure, Presentation layers). Use when structuring applications or ensuring dependencies point inward.
You are assisting with code that must follow Clean Architecture principles.
Dependency Rule: Source code dependencies must point INWARD toward higher-level policies.
What: Enterprise business rules, domain models Responsibilities:
For admission system:
Student, Course, AdmissionRule, Grade, QuotaWhat: Application-specific business rules Responsibilities:
For admission system:
EvaluateAdmissionUseCaseCalculateCompetencePointsUseCaseApplyQuotaRulesUseCaseWhat: Convert data between use cases and external agencies Responsibilities:
For admission system:
AdmissionRuleRepositoryStudentGatewayRESTControllerWhat: External tools and frameworks Responsibilities:
# GOOD: Use case depends on abstraction
class EvaluateAdmissionUseCase:
def __init__(self, rule_repository: RuleRepositoryProtocol):
self._repository = rule_repository
# Repository implementation is in outer layer
class PostgresRuleRepository(RuleRepositoryProtocol):
pass
[Entities] <- [Use Cases] <- [Interface Adapters] <- [Frameworks]
(Domain) (Application) (Infrastructure) (External)
src/
├── domain/ # Entities layer
│ ├── entities/
│ ├── value_objects/
│ └── domain_services/
├── application/ # Use cases layer
│ ├── use_cases/
│ ├── ports/ # Interfaces/protocols
│ └── dtos/ # Input/output models
├── infrastructure/ # Interface adapters
│ ├── repositories/
│ ├── gateways/
│ └── adapters/
└── presentation/ # External layer
├── api/ # REST/GraphQL
├── cli/
└── web/
AdmissionRule entity with evaluation logicStudent entity with validationCompetencePoints value objectEvaluateAdmissionUseCase(student_id, program_id)RuleRepositoryProtocol interfaceSQLAlchemyRuleRepository implementing protocolSamordnaOpptak external API adapterWhen applying Clean Architecture: