首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FluentValidation即服务

FluentValidation即服务
EN

Stack Overflow用户
提问于 2011-01-27 05:44:53
回答 1查看 2.9K关注 0票数 3

我正在使用FluentValidation 2来验证一些实体。我想创建一个可以传递给其他服务以允许它们执行验证的IValidationService。我想像这样公开它:

代码语言:javascript
复制
public interface IValidationEngine
{
    IEnumerable<ValidationError> Validate<T>(T entity);
}

其中ValidationError是封装我的验证错误的类。理想情况下,我希望不必向我的某个服务(如OrderValidator)公开特定的验证器。我希望验证服务能够构造/找到正确的验证器。FV有没有内置的东西来定位特定类型的验证器(它会在内部缓存)?或者,我是否必须走IValidatorFactory路线,然后将每个验证器与我的IoC容器连接起来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-27 22:42:03

我已经设法用IValidatorFactory方法解决了这个问题。我使用的是Ninject,所以下面具体的IoC细节需要修改。

代码语言:javascript
复制
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.
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4810382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档