13

データベース テーブルのコレクション (たとえば、Access ファイル内) があり、このコレクション内の各テーブルを、すべてのテーブルに共通のルールと、テーブルの 1 つまたはサブセットに固有の個別のルールの両方を持つルール セットに対して検証する必要がある場合テーブル、誰かが調べるのに良いデザインパターンを推奨できますか?

具体的には、次のようなコードは避けたいと思います。

void Main()
{
    ValidateTable1();
    ValidateTable2();
    ValidateTable3();
}

private void ValidateTable1()
{
    //Table1 validation code goes here
}

private void ValidateTable2()
{
    //Table2 validation code goes here
}

private void ValidateTable3()
{
    //Table3 validation code goes here
}

また、log4net を使用してすべてのエラーと警告をログに記録することにしました。これにより、各メソッドを宣言でき、void何も返す必要がなくなります。ValidationExceptionこれは良い考えですか、それともすべての例外をキャッチList<ValidationException>し、最後にすべてを出力する前にそれらを保存するようなものを作成する方が良いでしょうか?

これはうまくいくように見えますが、実際に動作するコードサンプルをいくつか見つけたいと思っています。助言がありますか?過去に似たようなことをした人はいますか?

背景として、プログラムは C# または VB.NET のいずれかで記述され、テーブルは Access または SQL Server CE のいずれかに格納される可能性が高くなります。

4

5 に答える 5

18

これに関する最新情報:デコレータパターンを使用することにしました。つまり、IValidateableTableインターフェイス(validate()メソッドを含む)を実装する「ジェネリック」テーブルクラスが1つあります。implement IValidateableTable次に、検証しようとしている各テーブルをラップできるいくつかの検証デコレータ(これも)を作成しました。

したがって、コードは次のようになります。

IValidateableTable table1 = new GenericTable(myDataSet);
table1 = new NonNullNonEmptyColumnValidator(table1, "ColumnA");
table1 = new ColumnValueValidator(table1, "ColumnB", "ExpectedValue");

次に、table1.Validate()必要なすべての検証を呼び出すデコレータを介してアンワインドする呼び出しを行う必要があります。これまでのところ、それは本当にうまく機能しているようですが、私はまだ提案を受け入れています。

于 2008-09-16T13:50:23.427 に答える
5

それぞれに何らかのタイプの ValidationSummary を返します...または構造化方法に応じて IList を返します。

次のような魔法を選択することもできます。

using(var validation = new ValidationScope())
{
   ValidateTable1();
   ValidateTable2();
   ValidateTable3();

   if(validation.Haserrors)
   {
       MessageBox.Show(validation.ValidationSummary);
       return;
   }

   DoSomethingElse();
}

次に、ValidateTable は次のように現在のスコープに到達します。

ValidationScope.Current.AddError("col1", "Col1 should not be NULL");

その趣旨の何か。

于 2008-09-05T15:28:58.353 に答える
4

2 つのアプローチ:

  1. ビジネス オブジェクトの匿名メソッドが検証に使用されるCSLA 。
  2. JP Boodhoo のブログを読んでください。彼はルール エンジンを実装し、非常に詳細な投稿とサンプル コードを公開しています。また、見る価値のあるDNR TVのエピソードで彼が働いているのを見ることができます。
于 2008-09-21T16:47:19.067 に答える
1

データベースの世界における制約と呼ばれる概念について本当に話していると思います。制約は、データベースに含まれるデータの整合性をデータベースが保証する方法です。この種のロジックは、アプリケーションではなくデータベースに配置する方がはるかに理にかなっています (Access でさえ、列内の値の一意性やリストからの値などを要求するなど、基本的な形式の制約を提供しています)。
もちろん、入力の検証 (個々のフィールドの) は別の問題であり、DB にテーブル列の明確な制約がある場合でも、アプリケーションはそれを実行する必要があります (問題が発生した場合にユーザーに適切なフィードバックを提供するため)。

于 2008-10-10T09:30:24.803 に答える