public void AddBooking(UserId userId, int day, Slot slot) { if (UserCanBook(this, userId) && IsBookableDay(Year, Month, day)) { if (BookingDays.ContainsKey(day)) { var bookingDay = BookingDays[day]; if (SlotIsOpen(bookingDay, slot)) { bookingDay.AddBooking(slot, userId); } else { throw new SlotIsClosedException(); } } else { var bookingDayId = BookingDayId.From(new DateTime(Year, Month, day)); var bookingDay = new BookingDay(bookingDayId, new Dictionary <Slot, UserId>()); bookingDay.AddBooking(slot, userId); BookingDays.Add(day, bookingDay); } } else { throw new UserHasOverbookedException(); } }