5

私はasp.netのMVC 3とDDDでWebアプリケーションを開発しています。ドメインモデルの検証では、Fluent Validationを使用しています。それは私の最初のプロジェクトで、流暢なバリデーションがあり、私はまだエンティティを学習し、モデリングしています。流暢検証とのIoC(一意のフィールド)

私のエンティティのお客様が私のシステムで一意である必要がある2つのプロパティがあり、これらのプロパティは、電子メールとCPF(それはブラジルの文書だと、すべてのシステムで一意である必要があります)です。私は知りたいです、どうすればいいですか?

スヨンは、私のideiaは、お客様の私の検証クラスで(コンストラクタで)私のリポジトリを注入し、カスタム検証により、それを確認しています。検証は、リポジトリを使ってチェックします。もし私のテーブルに、この電子メールでIDとは異なるレコードがあれば(挿入と実際のIDは0です...レコードを確認する必要はありません。 dは常に真です)。このような何かしようとして

I`m:

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

    } } 

を私は、可能であれば知っているバリデータの内側にリポジトリを注入し、そしてどのように私は.Must方法の拡張で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ダーリンのおかげで、あなたのコメントは私の混乱につながった。この検証は別の場所で行うべきですか?私のデータベースでは、この検証を行うためのいくつかの固有の制約がありますが、例外を回避するために、ドメインモデルとUIでそれを防ぐ必要があります。この検証クラスは、私のドメインのクラスライブラリプロジェクト内にあります。または、検証レイヤを実行する必要がありますか?私はDDDとコンセプトについてはあまりよく分かりません。私は学びたいと思っています...ありがとう:) –

+0

今は働いている人です!ありがとう! –

関連する問題