Todo lo nuevo en Plugin.ValidationRules 1.3

Contenido

Hay una librería que esta incluida en todos mis proyectos Xamarin y esa es Plugin.ValidationRules y mas ahora con su version 1.3 que tiene un montón de nuevas características para agilizar nuestro trabajo. Esta versión tiene muchas mejoras de calidad y nuevas características añadidas, incluyendo una nueva API Fluida (Fluent API), extensiones de métodos, wrapper para las validaciones con modelos, entre otras cosas.

¿por qué utilizar esta solución cuando hay otras alternativas mas reconocidas?

Simplemente, porque esta librería se preocupa de la UI porque esta enfocada en MVVM. Todos los cambios se reflejaran en la interfaz de usuario y no tendrás que crear propiedades extras para manejar ciertas lógicas. Eso a mi, y a mi equipo, nos ahorra un montón de tiempo.

Sin nada mas que agregar. ¡Comencemos!

Actualizando a 1.3

Esta actualización no tiene ningún cambio drástico que force a cambiar tu código cuando actualices, mas bien viene con muchas nuevas características que te ayudaran a optimizar tu tiempo. En resumen, no hay ningún cambio brusco, si actualizas ahora, todo debería seguirte funcionando igual.

Nuevas características

  • HasErrors propiedad agregada para los objetos Validatable.
...
       <Entry Text="{Binding Phone.Value, Mode=TwoWay}" />
       <Label Text="{Binding Phone.Error}" IsVisible="{Binding Phone.HasErrors}" />
...
  • Se ha añadido nuevo Validator Builder para los objetos Validatable.
    • Se ha añadido nuevo .Build() método para crear un objeto vacío Validatable.
    • Se ha añadido nuevo .WithRule(…) método para agregar reglas a un objeto Validatable.
    • Nuevo método de condición .When(…) añadida para un objeto Validatable.
    • Nuevo método de condición .Must(…) añadida para el objeto Validatable. Ahora no hay necesidad de crear reglas si no es necesario.
public class MyViewModel
{
        public MyViewModel()
        {
            ...
            Phone = Validator.Build<string>()
                        .WithRule(new IsNotNullOrEmptyRule())
                        .Must(CustomValidation, "Phone number need to be longer.")
                        .When(x => Name.Validate());
        }

        public Validatable<string> Name{ get; set; }
        public Validatable<string> Phone { get; set; }

        private bool CustomValidation(string parameter)
        {
            return parameter?.Length > 8;
        }
}
  • ValidationRule métodos de extensión añadidos:
    • Nuevo WithMessage añadido.
    • Nuevo IsRequired añadido.
...
     Phone = Validator.Build<string>()
               .IsRequired("The phone number is required.")
               .WithRule(new PhoneNumberRule().WithMessage("This phone number is incorrect.")));
...
  • Clase contenedor Validator  para validar modelos agregado.
    • Crea un ValidationUnit con todas las propiedades Validatable de tu modelo validador con el método InitUnit().
    • Genera un método Validate() predeterminado que pueda usar para validar tu validador de modelo sin mover un dedo.
    • Usa el Build() método para crear nuevos objetos Validable y su reglas con una API fluida.
    • Usa el Map() método que puedes invalidar para mapear tus propiedades. Recuerda que en la version anterior agregamos un auto mapper 😉
...
 public class UserValidator : Validator<User>
    {
        public UserValidator2()
        {
            //Email validations
            Email = Build<string>()
                        .IsRequired("A email is required.")
                        .WithRule(new EmailRule());

            InitUnit();
        }

        public Validatable<string> Email { get; set; }

        public override User Map()
        {
            // Simple Manual Mapper
            var manualMapperUser = new User
            {
                Email = this.Email.Value
            };

            return manualMapperUser;
        }
    }
...
...
     public UserValidator UserValidator { get; set; } = new();
...
     var isValid = UserValidator.Validate();
...
     var userData = UserValidator.Map();
...

ValidationRules por defecto que puedes usar con la nueva Fluent API

A continuación la lista de las reglas por defecto en esta versión:

  • IsCreditCard
  • IsEmail
  • IsEmpty
  • IsNotEmpty
  • IsEnum
  • IsEqual
  • IsNotEqual
  • IsNotEqual
  • IsInclusiveBetween
  • IsLessThan
  • IsLessThanOrEqual
  • IsNull
  • IsNotNull
  • WithLengthRule
  • WithExactLengthRule
  • WithMaxLengthRule
  • WithMinimumLengthRule
  • WithRegularExpression

Extras

Una de las ventajas de esta librería es que con el tiempo puedes ir creando una biblioteca de reglas que podrás reutilizar en todos tus proyectos y así agilizar los tiempos de desarrollo.

Cuando queremos reutilizar componentes al máximo, es muy común crear reglas que se encarguen de una sola tarea por ejemplo IsNotNullRule. Pensando en esto, con estructuras de validación complejas siempre vamos a tener que utilizar varias reglas en nuestras propiedades, y muy probablemente utilicemos estas reglas en varias paginas dentro de nuestra aplicación.

Para ayudar a los desarrolladores a agilizar este proceso con la nueva fluent API podemos crear extensiones que agreguen estas reglas por nosotros. A continuación un ejemplo.

...
        public static Validatable<TModel> IsRequired<TModel>(this Validatable<TModel> validatable, string errorMessage = "")
        {

            if(typeof(TModel) == typeof(string))
                validatable.Validations.Add(new NotEmptyRule<TModel>("").WithMessage(errorMessage));

            if (typeof(TModel).IsClass)
                validatable.Validations.Add(new NotNullRule<TModel>().WithMessage(errorMessage));

            return validatable;
        }
...

Al final, nuestra fluent API hara todo el trabajo por nosotros. Magic! 🎊

Recursos, Documentación, Ejemplos y Vídeos

Consulta las notas de los cambios de la version para obtener todos los detalles sobre lo nuevo en la version. Tambien puedes revisar la documentación inicial y la complementaria que son muy util.

Tambien puedes ver la documentación de la version anterior porque tiene un montón de nuevas características entre ellas el auto mapper para nuestros Model Validators.

No creo que sea necesario una nueva documentación, ya que las nuevas características solo sirven de soporte a lo que ya se había planteado.

El ejemplo de Xamarin.Forms lo puedes revisar desde hoy y esta actualizado con la nueva version de Plugin.ValidationRules.

Videos

Watch the video

Échale un vistazo a esta presentación como partida inicial para entender que hace el plugin. La misma la puedes encontrar en YouTube.

Conclusión

La verdad es que estoy muy contento con esta actualización, y es que una vez empiezas a utilizar el plugin se te hace muy difícil cambiarlo o tratar de utilizar otra cosa.

Tambien agradecer a Jesse por tener la iniciativa de crear un builder y por ser un colaborador en esta librería. De ahi nacen la mayoría de las nuevas características.

Actualicen el plugin a 1.3 a través del Administrador de paquetes NuGet. ¡Hazme saber cómo vas! Y si tiene algún problema, por favor crea un Issue o escríbeme por twitter @luismatosluna.

¿Qué opinas de este contenido?
 
Luis Matos

Luis Matos

I help professionals and companies to create value solutions. I am a Systems Engineer, blockchain executive, and international mobile application speaker. Founder of the Malla Consulting Agency and several international technology communities.
Suscribirte
Notificar de
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x

Buscar en el sitio