帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:Unity  Fluent  Fluentvalidation  


介绍

验证常常是开发项目的祸害。 它对可以用性和数据完整性( 通常,当确保数据不是攻击应用程序的尝试时) 非常重要,但是编写验证代码并处理所有的排列都很耗时。 幸运 Jeremy Skinner已经创建了一个优秀的开源验证框架调用 Fluent对. NET的验证。 Jeremy已经创建了大量文档,因此本文将不介绍. NET 验证的特性和用法。 文档的一个特性是如何在使用 Unity 时通过依赖注入传递验证对象,这是控制( IoC ) 容器的一个反转。 本文将介绍如何执行这里操作。 对于附加的示例,我使用了 Silverlight,但同样的技术可以与WPF一起使用。

背景

依赖注入是实现松散耦合的有用的Pattern,也可以以通过允许依赖关系来简化测试。 通过将验证对象传递到业务对象或者视图模型( 在MVVM的情况下),可以以为业务对象或者视图模型编写测试。 验证对象可以被存根化为始终通过或者失败的要求。

本文不涉及单元测试。模拟和依赖注入。 人们认为读者已经熟悉这些技术。

使用代码

第一步是创建 Unity 验证器工厂,该工厂由. NET 验证提供的ValidatorFactoryBase 提供。 重要的代码是 CreateInstance的重写,它允许工厂从 Unity 容器返回正确的验证对象。

publicclass UnityValidatorFactory : ValidatorFactoryBase
{
 privatereadonly IUnityContainer _container;
 public UnityValidatorFactory(IUnityContainer container)
 {
 _container = container;
 }
 publicoverride IValidator CreateInstance(Type validatorType)
 {
 return _container.Resolve(validatorType) as IValidator;
 }
}

下一步是使用 Unity 容器对工厂进行 register 操作。 在附加的示例中,这是在 Bootstrapper.cs 类中完成的。

Container.RegisterType<IValidatorFactory, UnityValidatorFactory>(new ContainerControlledLifetimeManager());

现在,可以通过从 AbstractValidator 基类继承来创建验证类。 有关如何从这里基类生成验证规则的更多信息,请参见的.NET 验证for文档。

publicclass MainPageViewModelValidator : AbstractValidator<IMainPageViewModel>
{
 public MainPageViewModelValidator()
 {
 RuleFor(x => x.FirstName)
. NotEmpty()
. WithMessage("First name cannot be blank.");
 RuleFor(x => x.LastName)
. NotEmpty()
. WithMessage("Last name cannot be blank.");
 RuleFor(x => x.Age)
. NotEmpty()
. WithMessage("Age is required.");
 RuleFor(x => x.Age)
. Must(a => a.IsInt32())
. When(x =>!x.Age.IsNullOrEmpty())
. WithMessage("Age must be an integer.");
 }
}

验证类还必须在 Unity 中注册。 在附加的示例中,这也在 Bootstrapper.cs 中注册。 为 IValidator 通用接口分配视图模型接口,注册的实现是视图模型验证器。

Container.RegisterType<IValidator<IMainPageViewModel>, MainPageViewModelValidator>(new ContainerControlledLifetimeManager());

现在 ViewModel 可以通过将验证工厂作为依赖项传入并请求所需的验证对象来访问验证对象。

using FluentValidation;privatereadonly IValidator<IMainPageViewModel> _validator;public MainPageViewModel(IValidatorFactory validatorFactory)
{
 _validator = validatorFactory.GetValidator<IMainPageViewModel>();
}

然后可以根据需要使用验证对象,或者验证整个视图模型,或者仅仅是属性( 在实现 IDataErrorInfo 时,这很有用,如附加的示例所示) 。 下面显示了验证属性的示例。 请注意,验证对象可以返回多个错误,因此 ValidationResult 包含一个 Errors 集合。

publicstring FirstName
{
 get { return _firstName; }
 set {
 if (_firstName!= value)
 {
 _firstName = value;
 RaisePropertyChanged("FirstName");
 }
 // validate - even if no change ClearError("FirstName");
 var validationResult = _validator.Validate(this, "FirstName");
 if (!validationResult.IsValid)
 {
 validationResult.Errors.ToList().ForEach(x => SetError("FirstName", x.ErrorMessage));
 }
 }
}

历史记录

  • July 2011 - 初始版本。


文章标签:Unity  Fluent  Fluentvalidation  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语