我有一个 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;
它肯定更短,我避免了一些(很多)代码重复。
但这真的更干净吗?这让我感觉有些不对劲。