2

予約を検証するために使用したい 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()??

}

したがって、主な問題は、ツアー コードをバリデーターに入力する方法または場所です...?

4

1 に答える 1

2

IRoomTypeServiceとIBookingValidatorに依存するサービスを作成することをお勧めします。IRoomTypeService依存関係から使用可能な部屋タイプを取得し、プロパティを介してそれらをバリデーターに渡します。例として、次のコードを参照してください。

public class BookingValidationService : IBookingValidationService
{
    public IRoomTypeService RoomTypeService { get; set; }

    public IBookingValidator BookingValidator { get; set; }

    public ValidationResult ValidateBooking(Booking booking, string tourCode)
    {
        BookingValidator.AvailableRooms = RoomTypeService.GetAvailableRoomTypesForTour(tourCode);

        return BookingValidator.Validate(booking);
    }
}
于 2010-07-23T12:38:54.580 に答える