我不认为有一个开箱即用解决方案,会做什么(即你的域验证领带到您的分贝)
但一些聪明的,我们可以实现的东西,将节省您大量的额外工作。
我建议考虑使用一个框架像FluentValidation
这将允许你创建你可以用它来在整个应用程序层验证您的域模型验证类。
因此,每个模型只需要一个验证类,然后数据库会让您知道该级别的任何问题。
或者,如果您需要,您可以创建一个验证类,每个图层,每个场景或真正你想要的。
看一看一些执行代码CodePlex从下面:
using FluentValidation;
public class CustomerValidator: AbstractValidator<Customer> {
public CustomerValidator() {
RuleFor(customer => customer.Surname).NotEmpty();
RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(customer => customer.Company).NotNull();
RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
}
}
Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);
bool validationSucceeded = results.IsValid;
IList<ValidationFailure>
failures = results.Errors;
好了,所以你怎么处理的值,如最大长度是多少?如果数据库中某个字段的最大长度为10,您是否会将值10硬编码到您的图层中?或者你使用中央配置? – Chris 2012-02-16 03:48:56
@ChrisPaynter:10被烘焙到类定义中。所有图层都依赖于对象来确定它是否有效。 – NotMe 2012-02-16 03:52:51
非常感谢。所以我猜你正在使用一个公共const int? – Chris 2012-02-16 04:27:38