2010-07-23 7 views
1

J'ai un validateur FluentValidation que je veux utiliser pour valider une réservation. Lors d'une réservation, vous devez choisir un type de chambre qui existe en tant que type de chambre disponible sur le circuit que vous choisissez. J'ai besoin d'obtenir les types de chambres disponibles à partir d'un service, en passant le code pour la visite. Quelle est la meilleure façon de gérer le code du tour où il doit être?FluentValidation Validator utilisant les arguments

Ce que j'ai jusqu'à présent:

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'} 
} 

Certains pirater le problème:

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()?? 

} 

Le problème principal est de savoir comment ou où pour obtenir le code de la visite dans le validateur ... ?

Répondre

1

Je suggère de créer un service qui dépend de IRoomTypeService et IBookingValidator. Il obtient les types de pièce disponibles à partir de la dépendance IRoomTypeService et les transmet au validateur via une propriété. Voir le code suivant à titre d'exemple:

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); 
    } 
}