5

asp.netmvc3とDDDを使用してWebアプリケーションを開発しています。私のドメインモデルの検証には、FluentValidationを使用しています。これは流暢な検証を行う私の最初のプロジェクトであり、まだエンティティの学習とモデリングを行っています。

私のエンティティCustomerには、システム内で一意である必要がある2つのプロパティがあります。これらのプロパティはEメールとCPFです(これはブラジルのドキュメントであり、すべてのシステムで一意である必要があります)。知りたいのですが、どうすればいいですか?

ああ、私のアイデアは、(コンストラクターによって)私のリポジトリを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, ?); });

     }   }

可能かどうかわからないので、バリデーター内にリポジトリを挿入します。.Mustメソッド拡張子でIDを取得するにはどうすればよいですか?またはそれを行う別の方法はありますか?

4

1 に答える 1

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が一意性をチェックしてから実際にレコードが挿入されるまでの間に、多くのことが発生する可能性があるためです。

于 2011-07-19T05:23:07.400 に答える