2010-07-23 48 views
1

我有一個我想用來驗證預訂的FluentValidation驗證程序。在預訂時,您必須選擇一種房間類型,作爲您選擇的旅程中的可用房型。我需要從服務中獲取可用的房間類型,並傳入遊覽代碼。處理旅行代碼所需的最佳方式是什麼?使用參數的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

我會建議創建一個依賴於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); 
    } 
}