gpt4 book ai didi

asp.net-mvc - 使用异常验证 Asp.net MVC 中的业务逻辑

转载 作者:行者123 更新时间:2023-12-04 10:06:14 25 4
gpt4 key购买 nike

我有一个关于我在 asp.net mvc 中用于进行业务规则验证的方法的问题。

目前我有一个看起来像这样的异常类

public class ValidationException : Exception 
{
private ModelStateDictionary State { get; set; }
public ValidationException(ModelStateDictionary state)
{
State = state;
}
public void MergeModelStates(ModelStateDictionary state)
{
state.Merge(this.State);
}
}

和一个看起来像这样的验证器
public void Validate(IEntity entity)
{
ModelStateDictionary state = new ModelStateDictionary();
if (entity.Contact != null && _service.GetBy(entity.Contact.Id) == null)
state.AddModelError("Contact", "Invalid Contact.");
if (entity.Title.Length > 8)
state.AddModelError("title", "Title is too long...");
... etc
if (!state.IsValid)
throw new ValidationException(state);
}

和一个做这样的事情的 Controller
public ActionResult Add()
{
var entity = new InputModel;
try
{
TryUpdateMode(inputModel);
..... Send input to a Repository (Repository calls Validate(entity);
}
catch (ValidationException validationException)
{
validationException.MergeModelStates(this.ModelState);
TryUpdateModel(inputModel);
return View("Add",inputModel);
}
return View("List");
}

使用异常来做这样的事情是错误的吗?
有没有更好方法的例子?我真的不想将验证添加到模型实体本身。我见过的唯一另一种方法是将 Controller 模型状态注入(inject)到存储库层,但这对我来说似乎很草率。

谢谢你的帮助

最佳答案

异常通常应该针对异常(exception)情况,而不是处理在程序正常执行期间可能经常发生的事情。这有很多很好的理由 - 这是我经常遇到的一些:

  • 性能问题 - 异常通常是相当昂贵的操作 - 如果它们定期抛出,您的性能可能会受到影响。
  • 处理未捕获的验证异常——如果你碰巧使用你的代码而不处理异常,你将把你的验证错误显示为“蓝屏”或崩溃处理程序——可能不是最好的用户体验。
  • 异常不是以允许面向用户的良好信息的方式构建的。看一下异常类 - 没有多少设置可以提供良好的面向用户的信息,这是您将信息传递回用户所需要的。每当我尝试以这种方式使用异常时,我都会得到一大堆带有附加属性的子类,这些属性对于属于异常并没有多大意义。

  • 我通常喜欢做的一种方法是提供一个公共(public)的 Validate 方法,它返回一个错误列表(但它本身从不抛出异常),然后是一个调用 Validate() 并在有任何错误时抛出异常的 Save 方法。您将行为从“如果模型无效则抛出”切换为“如果代码在模型处于无效状态时尝试保存则抛出”。

    为了解决下面关于 Validate 与 Save 中的 throws 性能的评论 - Save() 中的 throw 将与 Validate() 中的 throw 具有完全相同的性能损失。然而,关键的区别在于这永远不会发生——您要防止开发人员不正确地使用您的类,而不是使用异常作为验证方法。如果编写得当,调用 save 方法的代码应该类似于:
    ValidationResult result = obj.Validate();
    if (result.IsValid) {
    obj.Save();
    } else {
    // display errors to the user
    }

    仅当开发人员在保存之前忘记检查验证状态时才会引发异常。这样做的好处是允许在不使用异常的情况下进行验证,以及通过永远不允许保存无效实体来保护您的数据库。理想情况下,您根本不会在 Controller 中捕获异常并让一般错误处理例程处理它,因为问题不再是用户输入而是开发人员的错误。

    关于asp.net-mvc - 使用异常验证 Asp.net MVC 中的业务逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1637497/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com