IValidatableObject ve Tek Sorumluluk


12

Görünüm modellerinin IValidatableObject uygulamak ve özel doğrulama eklemek için izin MVC genişletilebilirlik noktasını seviyorum.

Bu kod tek doğrulama mantığı olması, Denetleyicilerim yalın tutmaya çalışın:

if (!ModelState.IsValid)
    return View(loginViewModel);

Örneğin, bir giriş görünümü modeli IValidatableObject uygular, yapıcı enjeksiyonu yoluyla ILoginValidator nesnesini alır:

public interface ILoginValidator
{
    bool UserExists(string email);
    bool IsLoginValid(string userName, string password);
}

Görünüşe göre, görünüm modellerine örnek enjekte etmek Ninject gerçekten yaygın bir uygulama değil, hatta bir anti-desen olabilir mi?

Bu iyi bir yaklaşım mı? Daha iyisi var mı?


Doğrulamayı ayrı bir nesnede istiyorsanız, FluentValidation'ı deneyin. Bkz. Fluentvalidation.codeplex.com/wikipage?title=mvc .
rmac

+1 Doğrulama için veritabanı bilgilerine erişmek zorunda kaldığım sorunumu çözen ayrı bir Validator sınıfı enjekte etmek için harika bir fikir!
magnattik

Yanıtlar:


7

Şahsen bana göre tasarımın temiz görünüyor.

IValidatableObject, görünüm modelinin basit özellikler tarafından sağlanamayan bazı doğrulama sağlayacağı anlamına gelir - tasarımınızı temiz tutan ve tek sorumluluk ilkesini ihlal etmemenizi sağlayan hizmetleri / veritabanlarını / arayacak gerçek doğrulayıcıyı enjekte etme - Görünüm Modelleri esasen, verilerin aktarılmasından ve aktarılan verilerin doğrulanmasından (nitelikler veya IValidatableObject veya her ikisi yoluyla olsun) sorumludur.


4

Doğrulama için özel bir nesneye sahip olmak, SRP'ye gerçekten saygı duymanızı garanti eder - bu zaten durumudur, çünkü verilerini doğrulamak için bir görünüm modelinin tipik bir sorumluluğu vardır.

Görüntüleme modellerine örnek enjekte etmeye gelince, bununla ilgili yanlış bir şey göremiyorum. Neyin enjekte edilebileceğinin neredeyse bir sınırı yoktur.


3

VM yapıcısına ILoginValidator'ı enjekte etmek yerine Validator'unuzu almak için ValidationContext'i (IValidatableObject.Validate () argümanı) kullanabilirsiniz.

public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{

var loginValidator = (ILoginValidator)vc.GetService(typeof(ILoginValidator));
return loginValidator.Validate();

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.