5

Asp.net mvc 3 ve DDD ile bir web uygulaması geliştiriyorum. Etki alanı model doğrulama için, Akıcı Doğrulama'yı kullanıyorum. Bu benim akıcı doğrulama ile ilk projem ve hala varlıkları öğrenme ve modelleme yapıyorum.Akıcı Doğrulama ve IoC (Benzersiz Alan)

İşletmemin Müşterim, sistemimde benzersiz olması gereken iki özelliğe sahiptir, bu özellikler E-posta ve CPF'dir (bu, bir Brezilya belgesidir ve tüm sistemde benzersiz olması gerekir). Bilmek isterim, nasıl yapabilirim?

Soo, benim ideia, benim doğrulama sınıfımdaki depolamamı (yapıcı tarafından) enjekte et ve bunu özel bir doğrulama ile kontrol et. Doğrulama, bu e-postada bir kimlikten farklı bir e-postayla (güncellemeler için 0 ve güncellemeler için gerçek Kimlik ...) tablodaki kayıt varsa, depoyu kullanarak kontrol eder. Çünkü güncellediğim kaydı kontrol etmem gerekir. d her zaman doğru olabilir). Böyle

I `çalışırken şey:

public class CustomerValidator : AbstractValidator<Customer> { 

    protected ICustomerRepository Repository { get; set; } 

    // I intend to inject it by IoC with Unity.. is it possible ? 
    public CustomerValidator(ICustomerRepository rep) 
    { 
     this.Repository = rep; 

     // other properties 

     RuleFor(customer = customer.Email) 
      .EmailAddress() 
      .NotEmpty() 
      .Must(email = { return Repository.IsEmailInUse(email, ?); }); 

     RuleFor(customer = customer.CPF) 
      .NotEmpty() 
      .Must(cpf = { return Repository.IsCPFInUse(cpf, ?); }); 

    } } 

Ben mümkün olup olmadığını bilmiyorum, doğrulayıcı içinde bir depo enjekte ve nasıl Kimliği .Must yöntemi uzantısında alabilir? Yoksa bunu yapmak için başka bir yöntem var mı?

cevap

9
RuleFor(customer => customer.Email) 
    .EmailAddress() 
    .NotEmpty() 
    .Must((customer, email) => Repository.IsEmailInUse(email, customer.Id)); 

RuleFor(customer => customer.CPF) 
    .NotEmpty() 
    .Must((customer, cpf) => Repository.IsCPFInUse(cpf, customer.Id)); 

Bu teklik kontrol de daha verimli, uygun istisna kayıt eklemek ve yakalamaya çalışıyor yerine doğrulamada yapıyoruz şu anda sistemin kendisi (veritabanı?) Tarafından yapılabilir, söyleniyor katmanı. Bunun nedeni, FluentValidation ürününüzün benzersizliği kontrol ettiği ve bir kayıt eklendiğinde gerçek zaman arasında birçok şeyin olabileceğidir.

+0

Uyanık Darin için teşekkürler, ama yorumunuz benim için bir karışıklığa yol açtı. Bu doğrulama başka bir yerde mi olmalı? Veritabanımda, bu doğrulamayı yapan bazı benzersiz kısıtlamalara sahibim, ancak istisnaları önlemek için, etki alanı modeli ve kullanıcı arabirimi tarafından da engellemem gerekiyor, doğru mu? Bu doğrulama sınıfı alan adımın sınıf kütüphanesi projesi kapsamında, doğru mu? Yoksa bir doğrulama katmanı mı yapmalıyım? DDD ve kavramlar hakkında çok şey bilmiyorum, öğrenmeye çalışıyorum ... Teşekkürler :) –

+0

Artık çalışıyor! Teşekkürler! –