2013-04-05 87 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