c# API-контроллер - повторять одни и те же строки снова и снова - PullRequest
0 голосов
/ 27 марта 2020

У меня есть 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;

Определенно короче, и я избегаю некоторого (большого количества) дублирования кода.

Но действительно ли это чище? Что-то в этом мне нравится.

...