FluentValidation is a .NET framework used to validate objects and values of properties inside an object. It allows you to write different rules without much effort thanks to its out of the box rule sets validators. However different properties require different validation rules, and FluentValidation allows for custom validators to be written, which again I think it’s great. Having said that, I recently needed to write a validation rule set for a property that depended also on the value of another property (in the same object).
Here’s what I came up with in a scenario where a DTO is received in an API endpoint used when users purchase Playstation games.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public class PurchasePlaystationGameDto | |
| { | |
| public int ID { get; set; } | |
| public int UserID { get; set; } | |
| public decimal Price { get; set; } | |
| public bool PlaystationPlusMember { get; set; } | |
| } | |
| public class PurchasePlaystationGameDtoValidator : AbstractValidator | |
| { | |
| public PurchasePlaystationGameDtoValidator() | |
| { | |
| RuleFor(x => x.ID).NotNull().GreaterThan(0).WithMessage("ID must be greater than 0."); | |
| RuleFor(x => x.UserID).NotNull().GreaterThan(0).WithMessage("UserID must be greater than 0."); | |
| RuleFor(x => x.Price).Must(BeGreaterThanZeroForNonMembers).WithMessage("Price must be greater than 0"); | |
| } | |
| private bool BeGreaterThanZeroForNonMembers(PurchasePlaystationGameDto dtoInstance, decimal price) | |
| { | |
| // game is free for members 🙂 | |
| if (!dtoInstance.PlaystationPlusMember & price <= 0) | |
| { | |
| return false; | |
| } | |
| return true; | |
| } | |
| } |
Simple and straight forward, if the user is a Playstation plus member then the price can be zero as the member is eligible for a free game.
That’s a wrap, until next post.
Bjorn