gpt4 book ai didi

asp.net-mvc - 服务层验证

转载 作者:行者123 更新时间:2023-12-03 22:24:00 25 4
gpt4 key购买 nike

我正在尝试在我的应用程序中实现验证策略。我有一个 MVC 层、服务层、存储库和域 POCO。现在在 MVC 层,我在我的 View 模型上使用数据注释来验证用户输入,从而让我能够给用户快速反馈。在 Controller 中,我调用 ModelState.IsValid 来检查输入,然后再使用 automapper 设置域对象。

这就是我的麻烦所在。我将我的域对象传递给需要根据我的业务规则对其进行验证的服务,但是如何将验证错误传递回 Controller ?我发现的示例执行以下操作之一:

  • 在 Service 层抛出异常并在 Contoller 中捕获。但这似乎是错误的,异常(exception)情况肯定是异常(exception),我们应该返回一些有意义的东西。
  • 使用 ModelStateWrapper 并将 ModelStateDictionary 注入(inject)到服务中。但是这种方法最终会展开为循环依赖( Controller 依赖于服务,服务依赖于 Controller ),这似乎是一种不好的代码味道。
  • 向 POCO 添加一个 Validate 方法。问题在于业务规则可能依赖于其他 POCO 对象,因此这肯定应该在有权访问所需表和对象的服务中完成。

  • 有没有我想念的更简单的方法?我已经看到了很多关于这个的问题,但除了上面提到的之外没有具体的解决方案。我认为服务中任何进行验证的方法都可以传回一些我可以在 Controller 中使用的键/值对象,但我不确定这个策略以后是否会出现问题。

    最佳答案

    我认为一种非常优雅的方法是在您的服务上使用一个 validate 方法,该方法从业务逻辑返回一个模型错误字典。这样,就不会向服务注入(inject) ModelState - 服务只是进行验证并返回任何错误。然后由 Controller 将这些 ModelState 错误合并回它的 ViewData。

    因此服务验证方法可能如下所示:

    public IDictionary<string, string> ValidatePerson(Person person)
    {
    Dictionary<string, string> errors = new Dictionary<string, string>();

    // Do some validation, e.g. check if the person already exists etc etc

    // Add model erros e.g.:
    errors.Add("Email", "This person already exists");
    }

    然后您可以在 Controller 中使用扩展方法将这些错误映射到 ModelState,例如:
    public static class ModelStateDictionaryExtensions
    {
    public static void Merge(this ModelStateDictionary modelState, IDictionary<string, string> dictionary, string prefix)
    {
    foreach (var item in dictionary)
    {
    modelState.AddModelError((string.IsNullOrEmpty(prefix) ? "" : (prefix + ".")) + item.Key, item.Value);
    }
    }
    }

    然后您的 Controller 将使用:
    ModelState.Merge(personService.ValidatePerson(person), "");

    关于asp.net-mvc - 服务层验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8487800/

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