我编写了一个自定义的
DataAnnotations
验证器(用于客户端和服务器):
public class CustomAttribute : ValidationAttribute, IClientModelValidator { /* ... */ }
然而,docs展示了另一种方法,使用三个类:
public class CustomAttribute : ValidationAttribute { /* ... */ }
public class CustomAttributeAdapter : AttributeAdapterBase<CustomAttribute> { /* ... */ }
public class CustomAttributeAdapterProvider : IValidationAttributeAdapterProvider { /* ... */ }
并且还必须在启动期间注册提供程序:
services.AddSingleton<IValidationAttributeAdapterProvider, CustomAttributeAdapterProvider>();
我的更简单的方法有效,我什至没有将其注册到容器中。
为什么文档显示更复杂的方法?我的方式是否缺少一些额外的功能或行为?
我的更简单的方法有效,我什至没有将其注册到容器中。
为什么文档显示更复杂的方法?我的方式是否缺少一些额外的功能或行为?
从您引用的文档中,我们可以发现使用继承自
ValidationAttribute
和IClientModelValidator
的自定义验证属性与使用额外的AttributeAdapter和ValidationAttributeAdapterProvider的区别:
创建一个派生自
AttributeAdapterBase<TAttribute>
的类并
实现 IValidationAttributeAdapterProvider
的类,以及
在 DI 中注册您的属性及其适配器。 这个方法如下
与服务器相关的单一责任原则
客户端相关的验证代码位于单独的类中。适配器
还有一个好处就是,既然是在DI注册的,其他
如果需要,可以使用 DI 中的服务。
在您的
IClientModelValidator
课程中实施ValidationAttribute
。
此方法可能合适 如果该属性不执行任何操作
服务器端验证,不需要 DI 的任何服务。