我刚刚将AccountController
中的大量代码重构为Authentication
提供程序类。用于执行此检查的控制器:
if (_memberRepository.GetByUserName(model.UserName) != null)
{
ModelState.AddModelError("", "The user name you have chosen already exists. Please choose another.");
return View(model);
}
我已将其移至我的Authentication
课程,但我无法访问ModelState
。
if (_memberRepository.GetByUserName(newMember.LoginName) != null)
{
// Panic stations!!
}
我应该:
a)返回描述新方法的状态或结果的类?我觉得这太复杂了。 b)抛出异常(可能是ArgumentException?),表示我反对注册重复的用户名?这是快速而简单的,但它与使用业务逻辑的例外
相关我看到已有MembershipCreateUserException
,但我想避免使用内置会员功能。这不是好OO,我觉得使用它很脏。
答案 0 :(得分:2)
简短回答:输入验证永远不应该抛出。
长答案:“您选择的用户名已经存在”是一种预期且可预测的错误,应该优雅地处理而不抛弃。它与登录时的错误密码没有什么不同。 如果您无法创建新用户,则应该抛出异常,因为数据库无法访问,例如。
尽管如此,你或许可以通过例外来解决问题:这只是最佳实践的问题。
答案 1 :(得分:1)
您可以out
出现错误消息。或者,向提供程序添加一个简单的方法,除了检查名称是否可用(然后可以异步调用)之外什么都不做。然后,您已经将名称检查的行为与注册逻辑隔离开来,因此所有必须关注的是添加用户。
答案 2 :(得分:1)
这种情况很特殊,我会抛出异常。每次检查状态类或out参数对我来说(以及oldschool)都会变得更脏。 我认为更清洁的是为常见案例编写代码并处理具有异常的特殊情况。
答案 3 :(得分:0)
看起来异常是错误的,因为你期望这种情况(验证用户输入)。
我会创建单独的方法,只需检查具有此名称的用户是否存在。
您可以尝试重命名现有方法,以明确如果用户不存在,将返回一些特殊(null?)值。