如果我有一组数据库表(例如,在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中.
只是对此的更新:我决定采用Decorator模式.也就是说,我有一个'通用'表类,它实现了一个IValidateableTable
接口(包含validate()
方法).然后,我创建了几个验证装饰器(也是implement IValidateableTable
),我可以包围我正在尝试验证的每个表.
所以,代码最终看起来像这样:
IValidateableTable table1 = new GenericTable(myDataSet); table1 = new NonNullNonEmptyColumnValidator(table1, "ColumnA"); table1 = new ColumnValueValidator(table1, "ColumnB", "ExpectedValue");
然后,我需要做的就是调用table1.Validate()
哪个通过装饰器展开调用所有需要的验证.到目前为止,它似乎工作得很好,但我仍然愿意接受建议.
我会为每一个返回某种类型的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");
这样的事情.