我喜欢MVC的可扩展点,允许视图模型实现IValidatableObject,并添加自定义验证。
我试图让我的控制器保持简洁,让这些代码成为唯一的验证逻辑:
if (!ModelState.IsValid)
return View(loginViewModel);例如,登录视图模型实现IValidatableObject,通过构造函数注入获取ILoginValidator对象:
public interface ILoginValidator
{
bool UserExists(string email);
bool IsLoginValid(string userName, string password);
}在视图模型中注入实例似乎不是一种常见的做法,甚至可能是一种反模式?
这样做好吗?还有更好的吗?
发布于 2012-06-15 13:47:09
就我个人而言,你的设计似乎很干净。
IValidatableObject意味着视图模型将提供一些简单属性无法提供的验证--注入真正的验证器,该验证器将调用服务/数据库/任何保持设计整洁的功能,并确保您不违反单一责任原则--视图模型基本上负责传输数据和验证所传输的数据(无论是通过属性还是通过IValidatableObject,还是两者兼而有之)。
发布于 2012-06-15 14:09:09
拥有一个用于验证的专用对象可以保证您确实尊重SRP --这已经是事实了,因为验证其数据是视图模型的典型责任。
至于将实例注入视图模型,我看不出有什么问题。几乎没有什么可以被注入什么东西的限制。
发布于 2012-10-26 17:01:16
与将ILoginValidator注入VM构造函数不同,您可以使用ValidationContext (即arg到IValidatableObject.Validate())来获取Validator。
public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{
var loginValidator = (ILoginValidator)vc.GetService(typeof(ILoginValidator));
return loginValidator.Validate();
}https://softwareengineering.stackexchange.com/questions/153065
复制相似问题