在我的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
。
这样做的方法是什么,以便我的模型可以(不确定这是否是正确的词) 可伪装 进行单元测试?
答案 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 的成本。