29

Aprill

Valideerimine ilusate liidestega

Marek Tihkan

Eelmisest veidi parem valideerimise variant tundub olevat kapseldada reeglid ühte eraldiseisvasse klassi. See on hästi kooskõlas ka Single Responibility Principlega.

public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator()
    {
        RuleFor(x => x.FirstName).NotNull().And.Length(1, 25);
        RuleFor(x => x.LastName).NotNull().And.Length(1, 25);
        RuleFor(x => x.PersonalCode).NotNull().And.Matches("[0-9]{11}");
        RuleFor(x => x.DateOfBirth).NotNull().And.LessThan(DateTime.Today);
        RuleFor(x => x.Age).NotNull().And.GreaterThan(1).And.LessThan(120);
    }
}

Siinkohal oleks mõistlik luua enda baasklass ning liides:

public interface IValidator<TEntity>
{
    IValidationResults Validate(TEntity entity);
}

public abstract class BaseValidator<TEntity> : AbstractValidator<TEntity>, IValidator<TEntity>
{
    public IValidationResults Validate(TEntity entity)
    {
        //...
    }
}

public class PersonValidator : BaseValidator<Person>
{
    public PersonValidator()
    {
        //...
    }
}

Edaspidi võime registreerida ServiceLocatoris IValidator<Person> liidesele vastavaks PersonValidatori ning enne salvestamist samalaadselt valideerimine läbi viia.

Sellise lahendusega tekkib ka mõningasi keerukohti, mis võivad tahta lahendamist. Kuna kasutusel on generic tüübid, siis on veidi raskem lisada seda NHibernate‘ salvestamise eelseks sündmuseks. Selleks tuleb meil eelnevalt kokku panna tüüp IValidator<TEntity>, kus TEntity on määratud konkreetse tüübiga. Alternatiivne lahendus on kasutada seda lihtsalt IRepository<TEntity>.Save(TEntity entity) meetodis.

Erinevalt atribuutidest pole meil väga võimalusi luua konventsioone, mistõttu tuleb meil osades kohtades rohkem koodi kirjutada või leida alternatiivseid lahendusi (reeglitest välja lugeda atribuudiga seotud nõuded).

Hea külg selle juures on see, et saame kasutada raamistikke, kus on äriobjektid defineeritud, sest me ei pea lisama atribuute neile, vaid kirjutame valideerimise reeglitega klassi juurde.

Raamistikud:

Loe veel sarnastel teemadel:

  • Share/Bookmark

KATEGOORIAD » .NET,Analüüs/Arhitektuur

SILDID » , , ,

Lisa kommentaar

  • * Kuvatakse kommentaari juures
  • * Ei publitseerita