当前位置:  开发笔记 > 编程语言 > 正文

数据验证设计模式

如何解决《数据验证设计模式》经验,为你挑选了2个好方法。

如果我有一组数据库表(例如,在Access文件中),并且需要根据规则集验证此集合中的每个表,该规则集在所有表中都有通用规则,以及特定于一个或一个子集的单个规则.表,有人可以推荐一个好的设计模式来研究吗?

具体来说,我想避免类似的代码:

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之前将它们全部打印出去?

我确实找到了这个,看起来它可能有用,但我希望能找到一些代码样本来解决.有什么建议?过去有没有人做过类似的事情?

对于某些背景,程序将使用C#或VB.NET编写,并且这些表很可能存储在Access或SQL Server CE中.



1> jerhinesmith..:

只是对此的更新:我决定采用Decorator模式.也就是说,我有一个'通用'表类,它实现了一个IValidateableTable接口(包含validate()方法).然后,我创建了几个验证装饰器(也是implement IValidateableTable),我可以包围我正在尝试验证的每个表.

所以,代码最终看起来像这样:

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

然后,我需要做的就是调用table1.Validate()哪个通过装饰器展开调用所有需要的验证.到目前为止,它似乎工作得很好,但我仍然愿意接受建议.



2> Ben Scheirma..:

我会为每一个返回某种类型的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");

这样的事情.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有