4

モデルを保存する前にモデルを検証する最良の方法と、その長所と短所を知りたいです。サービス層とIValidatableObjectの間で疑問があります。

サービス層:

public class PersonService
{
    public void Insert(Person person)
    {
        if (!IsValid(person))
        {
            //something
        }
    }
}

IValidatableObject:

public class Person:IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!IsValid(this))
        {
            //something
        }
    }
}
4

1 に答える 1

11

IValidatableObjectは通常、エンティティの自己検証に使用されます。つまり、検証は のプロパティのチェックに限定されますPerson

自己検証 (例IValidatableObjectおよびDataAnnotations ) は、ユーザー インターフェースなどでの「初期」チェックに役立ち、ユーザーがすべての必須フィールドに入力したことを確認し、正規表現の一致、文字列の長さ、日付範囲などの検証ルールを広く満たしていることを確認します。

エンティティをシステムの残りの部分から分離しておくためにPerson、データベースへの往復が必要な自己検証でより高度なビジネス ルールを実行したり、外部システムへのサービス呼び出しを使用したりすることはできません。

対照的に、サービス / ビジネス / マネージャー レイヤーで行われる検証は、通常、挿入 / 更新 / 状態遷移などのトランザクションの一部として使用され、これにより、より複雑な検証を行うことができます。

  • エンティティですぐに利用できない情報を必要とする追加のビジネス ルールをチェックできますPerson(つまり、データベースから関連データを取得したり、検証の決定を行うときに他の Web サービスを使用したりします)。ここでの例は、銀行口座に利用可能な資金があるかどうか、または 1 日に 10 回を超える引き出しが行われたかどうかを判断することです。
  • 状態固有のルールの検証。たとえば、人を挿入または更新するときに異なるルールが適用される場合や、人が生きているか死んでいる場合に異なるルールが適用される場合があります。この追加のコンテキストは、自己検証では利用できない場合があります。
  • ただし、サービス/ビジネス層のチェックでは、ルールの重複を防ぐために自己検証 (例:を使用することperson.Validate()を含む) を使用できます。IValidatableObject
于 2012-09-26T11:38:19.757 に答える