Oi Willian! Tudo bem?
Realmente, não é ideal que os casos de uso conheçam detalhes do framework de persistência. Aqui está uma abordagem que pode te ajudar:
Utilização de um Serviço de Transação
Você pode criar um serviço de transação que encapsula a lógica de início, commit e rollback das transações. Esse serviço pode ser injetado nos seus casos de uso sem que eles precisem conhecer os detalhes do framework de persistência.
Exemplo Prático:
Criar uma interface de serviço de transação:
public interface TransactionService {
void executeInTransaction(Runnable action);
}
Implementar a interface utilizando o framework de persistência:
Se você estiver usando Spring, por exemplo:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class SpringTransactionService implements TransactionService {
@Override
@Transactional
public void executeInTransaction(Runnable action) {
action.run();
}
}
- Usar o serviço de transação nos seus casos de uso:
public class PurchaseUseCase {
private final TransactionService transactionService;
private final OrderRepository orderRepository;
private final ProductRepository productRepository;
public PurchaseUseCase(TransactionService transactionService, OrderRepository orderRepository, ProductRepository productRepository) {
this.transactionService = transactionService;
this.orderRepository = orderRepository;
this.productRepository = productRepository;
}
public void execute(PurchaseRequest request) {
transactionService.executeInTransaction(() -> {
Order order = createOrder(request);
orderRepository.save(order);
productRepository.updateStock(request.getProductId(), request.getQuantity());
});
}
private Order createOrder(PurchaseRequest request) {
// lógica para criar o pedido
}
}
Dessa forma, você mantém a separação de preocupações: o caso de uso não precisa conhecer detalhes sobre transações, e a lógica de transação é encapsulada em um serviço específico.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.