我有一个WCF Web服务,客户可以使用它来上传多个数据线。为了验证数据,我使用Enterprise Library Validation Block。记录可以嵌套多层。
如何识别验证失败的记录?
考虑以下数据结构。对于每个大陆,可以有多个国家,每个国家可以有多个城市。
当市长的确认失败时,我想知道哪个城市,国家和康泰特失败了。
答案 0 :(得分:1)
我通过以下方式解决了我的问题:
(Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF)
public class ValidationKeyAttribute : Attribute
{
}
将放在标识数据记录的Property上。
public interface IValidationBackReference
{
object BackReference { get; set; }
}
这是从上述示例中的城市记录到国家/地区记录的引用,以便链中的所有标识符也包括在内
BeforeCall()
ValidationParameterInspector
方法
抓取所有输入并使用以下内容设置BackReference
:
private void SearchForBackReferences(object input, object backReference)
{
if (input == null)
{
return;
}
Type t = input.GetType();
if (t.IsArray)
{
Object[] inputs = (object[])input;
SearchForBackReferences(inputs, backReference);
}
else if (input is IValidationBackReference)
{
foreach (PropertyInfo info in t.GetProperties())
{
object value = info.GetValue(input, null);
SearchForBackReferences(value, input);
}
((IValidationBackReference)input).BackReference = backReference;
}
}
private void SearchForBackReferences(object[] inputs, object backReference)
{
if(inputs==null)
{
return;
}
foreach (object input in inputs)
{
SearchForBackReferences(input, backReference);
}
}
CreateValidationDetail
ValidationParameterInspector
方法
通过BackReferences使用类似的东西上传记录树
private static string FindKey(object target)
{
StringBuilder result = new StringBuilder();
if( target == null )
{
return result.ToString();
}
if(target is IValidationBackReference)
{
result.Append(FindKey(((IValidationBackReference) target).BackReference));
}
Type t = target.GetType();
foreach (var info in t.GetProperties())
{
if (Attribute.IsDefined(info, typeof(ValidationKeyAttribute)))
{
object objectValue = info.GetValue(target, null);
string stringValue = "(null)";
if (objectValue != null)
{
stringValue = objectValue.ToString();
}
result.Append(string.Format("{0} = '{1}'; ",info.Name, stringValue));
}
}
return result.ToString();
}
并将其放入Details.Key
的{{1}}。到目前为止,安装程序。
现在要做的就是在Webservice使用的类上实现ValidationKDetail
接口,并将IValidationBackReference
属性放在适当的属性上。
上面的示例如下所示:
[ValidationKey]
多么怪物......
答案 1 :(得分:0)
我认为您可能需要编写自己的验证程序,其中包含备份对象树并生成合适的验证错误消息所需的逻辑。请查看本文以获取更多信息: