首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IValidatableObject与单一责任

IValidatableObject与单一责任
EN

Software Engineering用户
提问于 2012-06-15 12:13:19
回答 3查看 4.7K关注 0票数 12

我喜欢MVC的可扩展点,允许视图模型实现IValidatableObject,并添加自定义验证。

我试图让我的控制器保持简洁,让这些代码成为唯一的验证逻辑:

代码语言:javascript
复制
if (!ModelState.IsValid)
    return View(loginViewModel);

例如,登录视图模型实现IValidatableObject,通过构造函数注入获取ILoginValidator对象:

代码语言:javascript
复制
public interface ILoginValidator
{
    bool UserExists(string email);
    bool IsLoginValid(string userName, string password);
}

在视图模型中注入实例似乎不是一种常见的做法,甚至可能是一种反模式?

这样做好吗?还有更好的吗?

EN

回答 3

Software Engineering用户

发布于 2012-06-15 13:47:09

就我个人而言,你的设计似乎很干净。

IValidatableObject意味着视图模型将提供一些简单属性无法提供的验证--注入真正的验证器,该验证器将调用服务/数据库/任何保持设计整洁的功能,并确保您不违反单一责任原则--视图模型基本上负责传输数据和验证所传输的数据(无论是通过属性还是通过IValidatableObject,还是两者兼而有之)。

票数 7
EN

Software Engineering用户

发布于 2012-06-15 14:09:09

拥有一个用于验证的专用对象可以保证您确实尊重SRP --这已经是事实了,因为验证其数据是视图模型的典型责任。

至于将实例注入视图模型,我看不出有什么问题。几乎没有什么可以被注入什么东西的限制。

票数 4
EN

Software Engineering用户

发布于 2012-10-26 17:01:16

与将ILoginValidator注入VM构造函数不同,您可以使用ValidationContext (即arg到IValidatableObject.Validate())来获取Validator。

代码语言:javascript
复制
public IEnumerable<ValidationResult> Validate(ValidationContext vc)
{

var loginValidator = (ILoginValidator)vc.GetService(typeof(ILoginValidator));
return loginValidator.Validate();

}
票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/153065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档