jer*_*ith 12 oop validation design-patterns
如果我有一组数据库表(例如,在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
}
Run Code Online (Sandbox Code Playgroud)
此外,我决定使用log4net记录所有错误和警告,以便可以声明每个方法void
,并且不需要返回任何内容.这是一个好主意还是更好的创建某种ValidationException
捕捉所有异常并将它们存储在一起List<ValidationException>
之前将它们全部打印出去?
我确实找到了这个,看起来它可能有用,但我希望能找到一些代码样本来解决.有什么建议?过去有没有人做过类似的事情?
对于某些背景,程序将使用C#或VB.NET编写,并且这些表很可能存储在Access或SQL Server CE中.
jer*_*ith 16
只是对此的更新:我决定采用Decorator模式.也就是说,我有一个'通用'表类,它实现了一个IValidateableTable
接口(包含validate()
方法).然后,我创建了几个验证装饰器(也是implement IValidateableTable
),我可以包围我正在尝试验证的每个表.
所以,代码最终看起来像这样:
IValidateableTable table1 = new GenericTable(myDataSet);
table1 = new NonNullNonEmptyColumnValidator(table1, "ColumnA");
table1 = new ColumnValueValidator(table1, "ColumnB", "ExpectedValue");
Run Code Online (Sandbox Code Playgroud)
然后,我需要做的就是调用table1.Validate()
哪个通过装饰器展开调用所有需要的验证.到目前为止,它似乎工作得很好,但我仍然愿意接受建议.
我会为每一个返回某种类型的ValidationSummary ...或者IList,具体取决于你想要如何构造它.
你也可以选择像这样做一些魔术:
using(var validation = new ValidationScope())
{
ValidateTable1();
ValidateTable2();
ValidateTable3();
if(validation.Haserrors)
{
MessageBox.Show(validation.ValidationSummary);
return;
}
DoSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)
然后ValidateTable将进入当前范围,如下所示:
ValidationScope.Current.AddError("col1", "Col1 should not be NULL");
Run Code Online (Sandbox Code Playgroud)
这样的事情.
归档时间: |
|
查看次数: |
28776 次 |
最近记录: |