3

我刚刚将大量代码重构AccountControllerAuthentication提供程序类。用于执行此检查的控制器:

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,我觉得使用它很脏。

4

4 回答 4

2

简短的回答:输入验证永远不应该抛出。

长答案:“您选择的用户名已经存在”是一种预期且可预测的错误,应该优雅地处理而不抛出异常。这与登录时输入错误的密码没有什么不同。例如,如果由于无法访问数据库而无法创建新用户,应该抛出异常。

不过,您也许可以通过异常使事情正常进行:这只是最佳实践的问题。

于 2012-07-02T06:43:08.583 回答
1

您可能会out收到错误消息。或者,向您的提供者添加一个简单的方法,该方法只检查名称是否可用(然后可以异步调用)。然后,您也将名称检查的行为与您的注册逻辑隔离开来,因此它所关心的只是添加用户。

于 2012-07-02T06:34:08.457 回答
1

这种情况是例外的,我会抛出异常。每次检查状态类或输出参数对我来说似乎更脏(还有老派)。我认为为常见情况编写代码并处理带有异常的异常情况会更干净。

于 2012-07-02T06:41:27.407 回答
0

看起来异常是错误的,因为您期望这种情况(验证用户输入)。

我将创建单独的方法来简单地检查是否存在具有此名称的用户。

您可以尝试重命名现有方法,以明确如果用户不存在,将返回一些特殊(null?)值。

于 2012-07-02T06:44:05.233 回答