FluentValidation Validator с использованием аргументов - PullRequest
1 голос
/ 23 июля 2010

У меня есть валидатор 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()??

}

Итак, главная проблема в том, как или где получить код тура в валидатор ...?

1 Ответ

1 голос
/ 23 июля 2010

Я бы предложил создать сервис, который зависит от 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...