public bool TryToReserveProduct(Product product, string sessionId, out Reservation reservation) { if (_stocksProvider.TryDecreaseStock(product.Id, 1)) { reservation = new Reservation(product, sessionId); if (!_reservationsProvider.TryAddReservation(reservation)) { // in case attempt to add reservation to the reservedInventory failed -> increase stock _stocksProvider.TryIncreaseStock(product.Id, 1); return(false); } return(true); } reservation = null; return(false); }