予約を検証するために使用したい FluentValidation バリデーターがあります。予約時に、選択しているツアーで利用可能な部屋タイプとして存在する部屋タイプを選択する必要があります。ツアーのコードを渡して、サービスから利用可能な部屋のタイプを取得する必要があります。必要な場所でツアー コードを取得するための最善の方法は何ですか?
私がこれまでに持っているもの:
public class BookingValidator : AbstractValidator<Booking>, IBookingValidator
public BookingValidator()
{
RuleFor(booking => booking.Rooms).SetValidator(new RoomValidator())
}
public class RoomValidator : AbstractValidator<Room>
public RoomValidator()
{
//validate that room.Type (eg. TWIN) exists in availableRoomTypes (eg List<string> {'SINGLE','TWIN'}
}
問題のいくつかのハック:
public class BookingValidator : AbstractValidator<Booking>
//should/can i pass in arguments here when IoC container is wiring up IBookingValidator to BookingValidator? Seems awkward
public BookingValidator(string tourCode)
{
//if so, use argument to get available room types, pass to RoomValidator
var availableRooms = RoomTypeService.GetAvailableRoomTypesForTour(tourCode);
RuleFor(booking => booking.Rooms).SetValidator(new RoomValidator(availableRooms))
//alternatively, tourCode is available from booking - is there some way to pass it to RoomValidator?
RuleFor(booking => booking.Rooms).SetValidator(new RoomValidator(),booking => booking.TourCode);
//Or is there some way I should be using .Must() or Custom()??
}
したがって、主な問題は、ツアー コードをバリデーターに入力する方法または場所です...?