Este registro descreve a organizacao de um backend seguindo a regra de dependencia (Martin, 2017): dependencias de codigo apontam apenas para dentro.
Estrutura de camadas
domain/ entidades e regras de negocio
application/ casos de uso
infrastructure/ bancos, servicos externos
presentation/ controladores de APIRegra de dependencia
Camadas internas nao conhecem camadas externas. O dominio nao importa frameworks; a infraestrutura implementa interfaces definidas pelo dominio.
# domain/repositories/user_repository.py
class UserRepositoryInterface(Protocol):
def save(self, user: User) -> User: ...
# infrastructure/repositories/postgres_user_repository.py
class PostgresUserRepository(UserRepositoryInterface):
def save(self, user: User) -> User:
# implementacao concreta
...O caso de uso depende da interface, nao da implementacao:
class CreateUserUseCase:
def __init__(self, repository: UserRepositoryInterface):
self._repository = repositoryConsequencia observada
A inversao de dependencia permite substituir a implementacao de persistencia sem alterar o caso de uso. Em testes, a interface e substituida por um duplo de teste, o que reduz o acoplamento a um banco real.
Referencias
- Martin, R. C. (2017). Clean Architecture. Prentice Hall.