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

现在,它正在努力工作!谢谢! –