我正在使用FluentValidation 2来验证一些实体。我想创建一个可以传递给其他服务以允许它们执行验证的IValidationService。我想像这样公开它:
public interface IValidationEngine
{
IEnumerable<ValidationError> Validate<T>(T entity);
}其中ValidationError是封装我的验证错误的类。理想情况下,我希望不必向我的某个服务(如OrderValidator)公开特定的验证器。我希望验证服务能够构造/找到正确的验证器。FV有没有内置的东西来定位特定类型的验证器(它会在内部缓存)?或者,我是否必须走IValidatorFactory路线,然后将每个验证器与我的IoC容器连接起来?
发布于 2011-01-27 22:42:03
我已经设法用IValidatorFactory方法解决了这个问题。我使用的是Ninject,所以下面具体的IoC细节需要修改。
public interface IValidationService
{
IEnumerable<ValidationError> Validate<T>(T entity)
where T : class;
}
public class FluentValidationService : IValidationService
{
private readonly IValidatorFactory validatorFactory;
public FluentValidationService(IValidatorFactory validatorFactory)
{
this.validatorFactory = validatorFactory;
}
public IEnumerable<ValidationError> Validate<T>(T entity)
where T : class
{
var validator = this.validatorFactory.GetValidator<T>();
var result = validator.Validate(entity);
return result.Errors.Select(e => new ValidationError(e.PropertyName, e.ErrorMessage));
}
}
// Then implement FV's IValidatorFactory:
public class NinjectValidatorFactory : ValidatorFactoryBase
{
private readonly IKernel kernel;
public NinjectValidatorFactory(IKernel kernel)
{
this.kernel = kernel;
}
public override IValidator CreateInstance(Type validatorType)
{
return kernel.TryGet(validatorType) as IValidator;
}
}
// I then wire both of these in a Ninject Module:
public class ValidationModule : NinjectModule
{
public override void Load()
{
this.Bind<IValidationService>().To<FluentValidationService>().InRequestScope(); // Specific to MVC.
this.Bind<IValidatorFactory>().To<NinjectValidatorFactory>().InRequestScope();
}
}
// Then I can use it inside a service:
public class FooService
{
private readonly IValidationService validationService;
public FooService(IValidationService validationService)
{
this.validationService = validationService;
}
public bool Add(Foo foo)
{
if(this.validationService.Validate(foo).Any())
{
// Handle validation errors..
}
// do other implementation details here.
}
}https://stackoverflow.com/questions/4810382
复制相似问题