IValidatableObject和依赖注入支持

时间:2011-11-10 16:04:02

标签: c# asp.net asp.net-mvc asp.net-mvc-3 dependency-injection

在我的ASP.NET MVC 3项目中,我在一个单独的类库项目中实现了存储库模式。

我也使用EF作为ORM。我还使用IValidatableObejct接口实现了一些模型验证。这是它的样子:

[MetadataType(typeof(AccommPropertySeasonPeriodAlias.MetaData))]
public partial class AccommPropertySeasonPeriodAlias : IValidatableObject {

    private class MetaData {

        [StringLength(5), Required]
        [Display(Name = "Period Alias Name")]
        public string AccommPropertySeasonPeriodAlias1 { get; set; }
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {

        var repo = new AccommPropertySeasonPeriodAliasRepository();

        if (repo.GetAll(this.AccommPropertySeasonID).
            Where(x => x.AccommPropertySeasonPeriodAlias1 == this.AccommPropertySeasonPeriodAlias1) != null)

            yield return new ValidationResult("Alias Name needs to be unique");
    }
}

如您所见,从现在开始,我的模型完全紧密耦合,因为我直接使用AccommPropertySeasonPeriodAliasRepository类而不是IAccommPropertySeasonPeriodAliasRepository

这样做的方法是什么,以便我的模型可以(不确定这是否是正确的词) 可伪装 进行单元测试?

3 个答案:

答案 0 :(得分:3)

Uniquiness约束超出了该实体的范围。从外部添加新实体时,应验证此约束。此验证不应属于实体本身。这取决于实体所处的环境,而不仅仅取决于该实体。

答案 1 :(得分:3)

可以使用MVC内置的解析器注入验证逻辑。

查看使用ModelValidatorProvider的用法,该用法使用MVC中的已注册容器解析。

ASP.NET MVC 3: Validating model when information external to the model is required

答案 2 :(得分:1)

您可以在 GetService(Type serviceType) 上使用 ValidationContext 方法 - 请参阅此处:https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.validationcontext.getservice?view=net-5.0#System_ComponentModel_DataAnnotations_ValidationContext_GetService_System_Type_

这是一种服务定位器模式,但比使用 DataAnnotationsModelValidator 的一些更复杂的实现要简单得多。有时,简单解决方案(使用 ServiceLocator 模式)的缺点超过了复杂的 IMO 的成本。