2009-05-16 5 views
7

更新やデータベースへの追加を行う前に、データベースとのやりとりが必要な検証を行う方法について、誰かがリンクやアドバイスを持っていますか?私が見ているすべての例は、プロパティを検証する方法を示しています。 「必須ですか」、「メールはありますか」、「数値ですか」などですが、「在庫切れ品はありません」の確認はどうやって行いますか? This xVal blog postに触れていますが、例はありません。asp.net mvc database interaction validation

私はリポジトリを使用するNerdDinnerチュートリアルに従っていますが、これは私が得意ではないビットです... OrderControllerをCreateメソッドで作成し、最初に作成した注文を作成する前にアイテムが在庫であることを確認してください。 NerdDinnerスタイルでは、コントローラはリポジトリを使用してデータベースと対話するため、Orderオブジェクト(Model)はデータベースと通信できないため、プロパティの検証とともにこの検証をどのように実施できますか?任意のヘルプ

答えて

0

ため

おかげで私は、メソッドPlaceOrder(受注オーダー)とOrderServiceのを作成します。 OrderServiceはリポジトリを使用してCRUD操作を実行し、ビジネスルール(在庫チェック)を実施し、最終的にキャッチしてユーザーに報告することができるルール違反について例外をスローします。

+0

私はこれをNerdDinnerのコンテキストで保持し、現時点ではサービスを使用しないことを望んでいました。できるだけシンプルに物事を維持して、それがどのように繋がっているかを頭の中で知りたいですか?ありがとうございました – atwrok8

3

NerdDinnerチュートリアルでは、IsVaildメソッドとGetRuleViolationメソッドをチェックアウトすることができます。ビジネスルールとデータベースルールに基づいて、これらのルールを使用して、挿入する前のデータをチェックすることができます。 IsValidForInsertメソッドを作成して、実行する必要のある特定のルールを挿入することもできます。

NerdDinnerでは、GetRuleViolationを使用すると、違反したルールを取得して、選択したとおりにインターフェイスにバブルアップすることができます。

public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 


     if (CheckDbForViolation) 
      yield return new RuleViolation("Database Violation", "SomeField"); 

     if (String.IsNullOrEmpty(Title)) 
      yield return new RuleViolation("Title is required", "Title"); 

     if (String.IsNullOrEmpty(Description)) 
      yield return new RuleViolation("Description is required", "Description"); 

     if (String.IsNullOrEmpty(HostedBy)) 
      yield return new RuleViolation("HostedBy is required", "HostedBy"); 

... etc ... 


     yield break; 
    } 

    public bool CheckDbForViolation() 

    { 

    /// Do your database work here... 

    } 

これをさらに実行し、データベースコードをリポジトリに分割することができます。 CheckDbForViolationは情報のレポを呼び出し、違反があったかどうかを判断します。実際にリポジトリを使用している場合は、それが望ましい方法だと思います。

+0

私はIsValidとGetRuleViolationsについて読んだことがありますが、 "在庫切れ品を注文できません"というシナリオについては言及していません。このタイプのビジネスルールはどこに置かれますか?ありがとう – atwrok8

+0

あなたの妥当性確認のステップの1つは、外出して、アイテムに在庫があるかどうかを確認するためにデータベースを照会することです。次に、正常か失敗かを判断し、データベースの書き込みが行われないようにします。 –

+0

私は検証ステップが何であるかを理解していますが、ロジックはどこに行くのですか?コントローラはリポジトリを使用するため、このロジックをコントローラに置く必要があるデータベースを照会することができますが、ビジネスルールをモデルに残す必要があると理解していますか?コントローラがリポジトリを使用すべきではないと思っていますか?ありがとう – atwrok8

1

これを行う方法の例から実際にガイダンスは必要ありません。最終的には、独自のアプリケーションを作成することができなければなりません。これは、創造的であることを意味します。

私は最初から、ある時点で制限に踏み込まないために、組み込みの検証またはメンバーシップAPIを使用しないことを決めました。

状況に応じて:これはかなり標準です。次のように

は実行フローを想像:

  1. 投稿フォーム
  2. 検証入力データフォーマットデータベース
  3. に話しなし(2)パスである場合は、点からの入力を検証しますビジネスルール/データの整合性。ここであなたはデータベースに話をします
  4. (3)が合格したら、それは何でもあなたの操作を実行してください。何らかの理由で失敗した場合(データベース内のデータ整合性ルールによって操作が禁止されている、たとえば、別のブラウザウィンドウから関連オブジェクトを削除した場合)、操作エラーをキャンセルしてユーザーに通知します。

コントローラーメソッドをできるだけ空にしてください。検証および操作ロジックは、モデルおよびビジネスロジックに存在する必要があります。コントローラは、基本的に1つの操作を試みる必要があり、返されたステータスに基づいて1つのビューまたは他のビューを返します。おそらくいくつかのオプションがありますが、ユーザーの役割、アクセス権、いくつかのWebサービスの呼び出しなど、すべてのチェックが負荷されるわけではありません。

P.S.私は時々、大多数の開発者にとってシンプルなものを単純化するために組み込まれた機能が削除されたものに対して新しい障壁を生み出す傾向があるという印象を受けます。

+0

あなたが列挙した実行フローはまさに私がやることですが、検証が行われるNerdDinnerの例に関してはわかりません。 Orderオブジェクトがリポジトリを使用し、次にControllerがOrderオブジェクトだけに話をした場合は、私にとっては意味があります。このようにしてOrderオブジェクトは両方の形式の検証を処理できるようになりました。これでデータベースに対話できるようになりました。ありがとう – atwrok8

+0

私はNerdDinnerの例に精通していません。リポジトリが何らかの種類のデータベース層を表している場合、中間的なビジネスロジック層(たとえば、Orderはビジネスオブジェクトと見なすことができます)が存在しますが、コントローラが何らかの目的でリポジトリを直接使用するのは間違いです。連絡先は:[コントローラ] <-> BLL <-> DALです。ときにはBLLの代わりにモデルを使うこともありますが、そうではありません。モデルは、表示するためにデータをパックするだけです。 – User