У меня есть BookingController с множеством методов для бронирования, которые вызываются из внешнего интерфейса.
Пример метода контроллера:
public IActionResult DoWhatever(Guid bookingId, DateTime newDeparture)
{
if (!_bookingRepository.BookingExistsAsync(bookingId))
return NotFound();
if (!_bookingRepository.IsBookingFromUserAsync(bookingId, User.Identity.Name))
return Forbid();
//start unique code, for example
var bookingEntity = await _bookingRepository.GetBookingAsync(bookingId);
if (newDeparture <= bookingEntity.Departure)
return UnprocessableEntity(new ErrorMessage("Booking cant be shortened"));
if (await _bookingRepository.CollidesWithOtherBookings(bookingEntity, newDeparture))
return UnprocessableEntity(new ErrorMessage("Booking collides with another Booking"));
bookingEntity.Departure = newDeparture;
_bookingRepository.UpdateBooking(bookingEntity);
return Ok();
}
Почти все мои методы начинаются с первые 4 строки. Как я могу извлечь их в небольшой дополнительный метод? Я также хотел бы, чтобы это было как можно короче. Код внутри точек также может содержать отдельные ранние возвраты.
Я пробовал много странных вещей, лучшее, что я мог придумать, это
private IActionResult CheckExistsAndAccess(Guid bookingId)
{
if (!_bookingRepository.BookingExistsAsync(bookingId))
return NotFound();
if (!_bookingRepository.IsBookingFromUserAsync(bookingId, User.Identity.Name))
return Forbid();
return Ok();
}
Тогда вызывающий код может быть
var returnCode = CheckExistsAndAccess(bookingId);
if (returnCode != Ok())
return returnCode;
Определенно короче, и я избегаю некоторого (большого количества) дублирования кода.
Но действительно ли это чище? Что-то в этом мне нравится.