5

我正在開發一個帶有asp.net mvc 3和DDD的Web應用程序。對於我的域模型驗證,我一直使用Fluent驗證。這是我的第一個流暢驗證項目,我仍然在學習和建模實體。Fluent驗證和IoC(唯一字段)

我的實體客戶有兩個屬性需要在我的系統中唯一,這些屬性是電子郵件和CPF(這是一個巴西文檔,需要在所有系統中都是唯一的)。我想知道,我該怎麼辦呢?

Soo,我的理念是,在我的Customer驗證​​類中注入(通過構造函數)我的存儲庫,並通過自定義驗證進行檢查。驗證將使用存儲庫進行檢查,如果在我的表中存在與此電子郵件不同的Id的記錄(插入爲0,更新爲真實Id)...我不需要檢查正在更新的記錄,因爲它' d總是如此)。

我真的想這樣的事情:

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, ?); }); 

    } } 

我不知道是否是可能的,注入驗證內部存儲庫,我怎麼能拿的Id的。必須擴展方法?還是有另一種方法來做到這一點?

回答

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)); 

這就是說,檢查是否有獨特性也可以通過在你試圖插入記錄和捕捉適當的異常,而不是在驗證這樣的時刻系統本身(數據庫?)可以更有效地完成層。其原因是,在您的FluentValidation檢查唯一性和插入記錄的實際時間之間可能會發生許多事情。

+0

感謝您的awser Darin,但您的評論導致我感到困惑。這個驗證應該在另一個地方嗎?在我的數據庫中,我有一些獨特的約束條件可以進行驗證,但我需要通過域模型和UI來阻止它,以避免出現異常,是嗎?此驗證類位於我的域的類庫項目中,是不是也適用?或者我應該做一個驗證層?我對DDD和概念瞭解不多,我正在努力學習...謝謝:) –

+0

現在,它正在努力工作!謝謝! –