2017-11-20 12 views
0

データベースを使用してデータ指向アプリケーションの文脈において、:その物事を:私は唯一のIdが正の数だった、または引数がnullないということのようなものを検証するためにFluentValidationsを使用していたFluentValidationsとどのような検証が行われますか?

データベースにヒットしませんでした。

しかし、しばらくしてからが実際にデータベースに照会することを検証しないのかと疑問に思った。そこで私はさらに検証することにしました。Validatorは、指定されたIDが正の数であることを検証するだけでなく、が存在することもまたであることを検証します。

これはバリデータの目標ですか?私はそれを悪用していますか?バリデータは複雑なビジネスルールもチェックする必要がありますか?

答えて

1

EntityValidationクラスには、ビジネスルールをチェックするためFluentValidatorを使用することを完全に罰金です。しかし、単純な検証からビジネスルールを分離する方が良いでしょう。たとえば、ASP.NETアプリケーションの場合、一般的な検証はプレゼンテーションレイヤー(ModelStateなど)で実行する必要がありますが、ビジネスルールはドメインレイヤー(たとえば、一部のサービスまたはdecorator)で再生する必要があります。

  1. ValidateModelAttribute
  2. Validate command using Decorator pattern
  3. Simple Injector(fast DI container, great for decorators)
+0

ありがとう!親指の一般的なルールは何ですか?私はWeb APIを実行しており、Validatorは各リクエストに対して動作します。たぶん、この側面のバリデーターは、Idが見つからないGetByIdのような共通のものを傍受することができます。しかし、要求がビジネスルールに従って満たす必要がある複雑な条件を検証することは理にかなっていますか?または、下位層で検証を実行し、条件が満たされていないときに適切な例外をスローする必要がありますか? – SuperJMN

+1

これは要件によって異なります。コントローラで基本的な検証を実行することは理にかなっています(FluentValidationを組み込みのパイプラインに統合してModelStateを使用するか、Validatorを手動で呼び出してValidateを手動で呼び出すことができます)。しかし、より複雑なドメインやDB関連の検証では、いくつかの下位層でエンティティを検証する方が良いでしょう(私は、あなたがいくつかのサービス、リポジトリ、またはコマンドハンドラを持っていることを望みます)。また、手動で、またはデコレータ/インターセプタを使用して行うこともできます。障害を示すには、例外をスローしたり、検証結果を返すことができます –

0

この種のバリデーションを行うには、次の2通りの方法があります。
1.クラスを作成し、ProperyValidatorから継承し、エンティティ検証クラスに使用します。

public class UniqueValidator<T> : PropertyValidator where T:class 
{ 
//inject the repository 
protected override bool isValid(PropertyValidatorContext context){ 
    //check the validity 
} 
} 

2.Create法directy私見

public class EntityValidation : AbstractValdiation<Entity>{ 
//inject the repository 


//your current validations 

public bool UniqueValue(Entity instance){ 
    //query to validate 
} 
} 
+0

は申し訳ありませんが、私はそれが内部の複雑なビジネスロジックをチェックするために、悪い考えですかどうかを聞いてるのよ:

あなたは便利なこれらのリンクを見つけることができますバリデーターかどうか。 – SuperJMN

関連する問題