0

我有一个 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;

它肯定更短,我避免了一些(很多)代码重复。

但这真的更干净吗?这让我感觉有些不对劲。

4

0 回答 0