Services¶
Services contain business logic and orchestrate use cases.
Location¶
Structure¶
class OrderService:
def __init__(self, order_repo, product_repo, payment_service):
# Inject dependencies
self.order_repo = order_repo
self.product_repo = product_repo
self.payment_service = payment_service
async def place_order(self, user_id: UUID, items: list) -> Order:
"""
Use case: Place an order.
Orchestrates: validation, payment, persistence.
"""
# 1. Validate items
products = await self.product_repo.get_by_ids(...)
# 2. Create order entity
order = Order(user_id=user_id, items=items)
order.calculate_total()
# 3. Process payment
await self.payment_service.charge(user_id, order.total)
# 4. Save and return
return await self.order_repo.save(order)
Rules¶
- One service per domain -
UserService,OrderService - Inject repositories - Never create them inside
- Return domain objects - Not database models