FluentValidation Validator Incorporated into IValidateableObject.txt
public class TrackValidator : AbstractValidator<Track>
{
	public TrackValidator()
	{
		RuleFor(track => track.Artist).Length(0, 30).WithMessage("Artist is required");
		RuleFor(track => track.Artist).Length(0, 40).WithMessage("Title is required");
		RuleFor(track => track.Starred).NotNull().Equal(x => true).Unless(track => track.Rating.
		HasValue && track.Rating > 0 && track.Rating < 10);
		RuleFor(track => track.Rating).NotNull().GreaterThan(0).LessThan(10).Unless(track => track.
		Starred.HasValue && track.Starred.Value);
	}
}
public class Track : IValidatableObject
{
	public int Id { get; set; }
	public string Artist { get; set; }
	public string Title { get; set; }
	public int? Rating { get; set; }
	public bool? Starred { get; set; }
	public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
	{
		var validator = new TrackValidator();
		var result = validator.Validate(this);
		return result.Errors.Select(item => new ValidationResult(item.ErrorMessage, new[]{ item.PropertyName }));
	}
}