2013-04-05 73 views
1

我想在调用数据库操作之前在ServiceStack中验证我的RequestDTO。 当我尝试验证请求DTO像ServiceStack验证功能抛出异常

ValidationResult result = this.AddBookingLimitValidator.Validate(request); 

代码自动自动投验证错误。 我甚至无法调试服务幕后发生的事情?我可以改变这种行为吗?或者我在这里做错了什么。 谢谢。

我的要求DTO:

[Route("/bookinglimit", "POST")] 
[Authenticate] 
public class AddBookingLimit : IReturn<AddBookingLimitResponse> 
{  
    public int ShiftId { get; set; } 
    public DateTime Date { get; set; } 
    public int Limit { get; set; } 
} 

我的回应DTO:

public class AddBookingLimitResponse 
{ 
    public int Id { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 
} 

验证类:

public class AddBookingLimitValidator : AbstractValidator<AddBookingLimit> 
{ 
    public AddBookingLimitValidator() 
    { 
    RuleFor(r => r.Limit).GreaterThan(0).WithMessage("Limit 0 dan büyük olmalıdır"); 
    } 
} 

服务实现:

public AddBookingLimitResponse Post(AddBookingLimit request) 
{ 
    ValidationResult result = this.AddBookingLimitValidator.Validate(request);   

    Shift shift = new ShiftRepository().Get(request.ShiftId); 
    BookingLimit bookingLimit = new BookingLimit 
    { 
    RestaurantId = base.UserSession.RestaurantId, 
    ShiftId = request.ShiftId, 
    StartDate = request.Date.AddHours(shift.StartHour.Hour).AddMinutes(shift.StartHour.Minute), 
    EndDate = request.Date.AddHours(shift.EndHour.Hour).AddMinutes(shift.EndHour.Minute), 
    Limit = request.Limit, 
    CreateDate = DateTime.Now, 
    CreatedBy = base.UserSession.UserId, 
    Status = (byte)Status.Active 
    }; 
    return new AddBookingLimitResponse 
    { 
    Id = new BookingLimitRepository().Add(bookingLimit) 
    }; 
     } 

APPHOST代码:

container.RegisterValidators(typeof(AddBookingLimitValidator).Assembly); 
Plugins.Add(new ValidationFeature()); 

而且我消耗在C#代码的服务:

try 
{ 
    AddBookingLimitResponse response = ClientHelper.JsonClient.Post(new AddBookingLimit 
    { 
    Date = DateTime.Parse(DailyBookingLimitDateTextBox.Text), 
    Limit = Convert.ToInt32(DailyBookingLimitTextBox.Text), 
    ShiftId = Convert.ToInt32(DailyDayTypeSelection.SelectedValue) 
    }); 
    WebManager.ShowMessage(UserMessages.SaveSuccessful.FormatString(Fields.BookingLimit)); 
    } 
    catch (WebServiceException ex) 
    { 
    WebManager.ShowMessage(ex.ResponseStatus.Message);   
    } 

回答

2

右键,ServiceStack验证请求DTO之前,如果启用了ValidationFeature服务被调用。

手动调用验证的服务,你必须从你的AppHost第一删除此行:

Plugins.Add(new ValidationFeature()); 

请确保您的服务验证属性的类型为IValidator<>,否则它赢得了”如果您使用container.RegisterValidators(typeof(AddBookingLimitValidator).Assembly)注册您的验证器,则不会由IoC容器注入。

public class TestService : Service 
{ 
    public IValidator<Request> Validator { get; set; } 

    public RequestResponse Post(Request request) 
    { 
     Validator.Validate(request); 
     ... 
    } 
} 
+0

谢谢你的回答。 – mustafasturan 2013-04-08 11:08:32