[ S A J A @ 02.01.2015. 15:43 ] @
Ovako...

Imam neku klasu koja ima gomilu Propertisa. Svaki ima ono Set/Get i radi se validacija prilikom upisa/izmene nečega.
Međutim, upis u bazu se ne radi kad se promeni Properti, za to sam napravio poseban Metod.

Kad se pokrene taj metod, hteo bih da izvršim ponovnu validaciju svih (ili određenih) Propertisa ali ne znam kako bih to mogao da izvedem.

Znači, validacija se radi kod dodeljivanja ili menjanja Propertiesa a posle kod upisa u bazu, jer je prošlo neko vreme, želim ponovo da uradim tu istu validaciju.

Kakva rešenja postoje za to?
[ Shadowed @ 02.01.2015. 22:03 ] @
Ako si dobro uradio stvar, ne bi trebalo da ti treba ponovna validacija. Ali, pod pretpostavkom da ti ipak treba, izmesti je van setter-a pa je pozivaj u setter-u i kad god ti je potrebna.
[ S A J A @ 02.01.2015. 22:21 ] @
Da, validacija je dobra ali je treba ponoviti. Na primer imam klasu Artikal, tamo ima propertis Naziv, kad se promeni tekst onda se u bazi proverava da li dotični već postoji i ako ne postoji onda se dozvoljava promena Propertisa. Međutim, pošto dalje može da prođe izvesno vreme pre nego što korisnik klikne na "Save" i upiše podatke u bazu, logično je da još jednom uradim validaciju. Moguće je da je u međuvremenu došlo do nekih promena na bazi pa nije pametno da radim upis na osnovu bajatih validacija. Pretpostavio sam da nema načina da se zatraži ponovna validacija Propertisa, moraću da izdvajam kod, a to mi se nikako ne sviđa jer će mi klasa biti dodatno nepreglednija. Malo mi je čudno da je ovo tako loše osmišljeno.
[ Shadowed @ 02.01.2015. 23:18 ] @
Pa nije to lose osmisljeno nego ni nije osmisljeno. Ne moze sve da ti bude isplanirano :) Osmisli sam :) Imas gomilu varijanti. Mozes ti i da uradis Artikal.Name = Artikal.Name i da setujes property ponovo i izazoves validaciju. Mozes cak i da napravis metod koji ce ti pomocu refleksije proci kroz sve property-je i uraditi takav re-set. Dodatno mozes i da napravis atribut pa da prethodno pomenuti metod resetuje samo property-e koji imaju taj atribut. A mozes i validaciju (na razlicite nacine) napraviti kao sto prvo rekoh u zasebnom metodu (ili metodama) pa ih pozivati odakle god ti treba, bilo iz setter-a ili dela za snimanje.
[ ssi @ 06.01.2015. 12:12 ] @
Probaj ovo:

Fluent validation .net

https://fluentvalidation.codeplex.com/

Ne moras da menjas klase, validatore mozes da konfigurises ili pozoves kad god hoces.

Primer

Code:

using FluentValidation;

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;


Klasa Customer je negde drugde...