在一个项目中,我有一组验证器对象,Validate
yield为每个错误返回ValidationResult
。反过来,这些被收集并抛出异常。我从这里偷了这个:Validation: How to inject A Model State wrapper with Ninject?
当需要验证的对象具有需要验证的复杂属性时,我最终会得到这样的笨重代码(我的问题是foreach
循环):
public class MembershipValidator
{
public override IEnumerable<ValidationResult> Validate(Membership entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
foreach (var result in userValidator.Validate(entity.User))
{
yield return result;
}
}
}
在这种情况下UserValidator
还有几个yield return
语句(其中一个在此处显示):
public class UserValidator
{
public override IEnumerable<ValidationResult> Validate(User entity)
{
if (entity == null)
{
throw new ArgumentNullException();
}
if (entity.BirthDate == DateTime.MinValue)
{
yield return new ValidationResult("User", "BirthDate is mandatory");
}
}
}
有没有办法在&#34; parent&#34;中编写代码?验证器更简洁?它现在充满了foreach
循环。
明确地编写以下代码构建,但不执行:
userValidator.Validate(entity.User);
以下不编译:
return userValidator.Validate(beschouwing.User);
答案 0 :(得分:0)
只需拆分参数检查(即抛出异常)并在两种方法中产生验证结果:
public override IEnumerable<ValidationResult> Validate(User entity)
{
if (entity == null)
throw new ArgumentNullException();
return UserValidationIterator(entity);
}
private IEnumerable<ValidationResult> UserValidationIterator(User user)
{
if (entity.BirthDate == DateTime.MinValue)
yield return new ValidationResult("User", "BirthDate is mandatory");
// other yields here
}
您可以使用相同的方法进行成员资格验证。