如何使用FluentValidation有效地验证依赖于外部数据的多个业务规则?

时间:2011-11-30 04:06:17

标签: asp.net-mvc-3 fluentvalidation

我的FormPartB对象有几个依赖于相关实体LicenseeFormPartA的业务规则。我是FluentValidation的新手。

我想做的是:

  • 在我的FormPartBValidator中,获取LicenseeFormPartA个实体一次,然后为{{1}设置一堆规则(即Must()谓词)使用这些相关对象的值。

  • 即。我不想在每个规则定义中再次获取两个外部实体。

我有几个想法:

(1)在我的FormPartB定义之上的Validator构造函数中获取这些实体,然后将这些实体保存为私有字段,

RuleFor

(2)在Validate()调用中获取这些实体,然后将这些实体保存为私有字段:

public PartBValidator()
{
    // Get my external data and save as private fields

    RuleFor...
    RuleFor...
}

然而

  • 在选项(1)中,我似乎无法访问FormPartB实例

  • 在选项(2)中,Validate()似乎没有像我想象的那样工作(即似乎没有在public override ValidationResult Validate(FormPartB instance) { // Get my external data and save as private fields return base.Validate(instance); } 的每次验证时调用。)

  • 我甚至不确定“获取对象并保存为私人字段”是正确的方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

我已经在应用程序中通过依赖注入服务到构造函数来处理这个问题,该构造函数检索验证所依赖的数据,并且它已经很好地完成了。

以下是一个例子:

private readonly IFormService _service;

public PartBValidator(IFormService service)
{
    _service = service;

    var valueICareAbout = _service.GetMeFormAData();

    RuleFor...  // uses valueICareAbout
    RuleFor...
}

如果您担心在规则定义中通过服务获取数据会对性能产生影响,您也可以考虑一些缓存选项。