2

在我的网络应用程序中,我的服务层负责所有逻辑(如注册等)。我想为我的表单实现服务器端验证。问题是我不能每次捕获无效数据时都抛出异常,因为如果用户输入了错误的电子邮件和密码,我的服务方法会在检查电子邮件后立即抛出异常,并且只有在用户之后才会注意到密码错误更正电子邮件并重新提交表格。我希望我的整个表格立即得到验证。重要的是:我只需要传递错误类型,显示消息必须添加到控制器中的 ModelState 中。我有一些想法,我希望您帮助我从性能和良好实践的角度来决定哪个更好(也许没有 - 也许还有另一种解决方案优于我发布的所有解决方案)。

想法:

  1. 在字典中收集错误,然后以键值的形式抛出包含所有模型错误的单个异常(例如“密码”、“必须 > 5 个符号”)。在控制器中,我捕获错误,并使用 switch() 读取所有条目以检测错误类型并将适当的消息添加到 ModelState。
    • 优点:使用内置的 Exception.Data 字典
    • 缺点:需要从字符串中破译错误类型
  2. 与以前类似,但我创建了自定义异常类,它具有额外的字段枚举字典(例如“密码”、ValidationEnum.LessThanFiveSignsError)。
    • 优点:枚举是 switch() 操作的更优雅的解决方案
    • 缺点:需要实现自定义异常来做一些内置异常类实际上可以做的事情
  3. 使用字典的自定义异常,但使用异常而不是枚举 - 我创建了 StringTooShortException 和 UsernameAlreadyExistsException 之类的类并将它们添加到字典中(例如“密码”,新的 StringTooShortException())。Switch 可能需要检查类型对象...
    • 优点:我使用异常?我越想越觉得这不是一个好主意……
    • 缺点:传递对象异常子类(具有所有异常类属性和东西)并且只使用该对象是什么类型的信息?
  4. 让我的每个服务方法都返回包含 {object regularReturnValueDependingOnMethod, MyCustomErrorContainer canBeListOfEnumsOrSomething} 的自定义类。这个和以前的想法之间的基本区别是我不会抛出异常只是为了将我的错误容器带到控制器,我使用正确的工作流程。
    • 优点:不抛出异常,只是向控制器返回验证错误,使用正确的工作流程来传递值
    • 缺点:包装每个方法的返回值只是为了将验证错误传回控制器不是太多了吗?也许验证错误正是这种情况,我应该使用异常将消息传送到控制器(无论该消息可能是:文本字符串,或者在这种情况下,整个对象)
  5. 不要包装返回值,只需在控制器中创建验证错误容器并将其作为“out”参数传递给服务
    • 优点:简单
    • 缺点:需要在调用任何服务方法之前创建错误容器实例(好的,只是那些验证输入的方法)。优雅吗?

你怎么看?哪个最好?我对完成它不感兴趣。我想以应有的方式完成它。我想学习良好的编程行为:)

谢谢你的帮助 :)

//编辑:我的最新想法:我可以创建另一个服务方法仅用于验证目的(例如方法:RegisterUser() 用于注册,ValidateRegisterUser() 用于模型验证,我只需要确保在我之前调用验证方法调用常规方法。你怎么看?

4

0 回答 0