C# 如何在API控制器中改进此操作? 概述

C# 如何在API控制器中改进此操作? 概述,c#,.net,design-patterns,asp.net-web-api,code-readability,C#,.net,Design Patterns,Asp.net Web Api,Code Readability,我正在设计一个将与另一个系统集成的api,但是我偶然发现了一个代码,我知道它可以改进,但我不知道如何正确地完成它 代码 要求 这是一个简单的操作,应该在响应内容中返回带有字符串的Ok 问题 检查有效输入是否有更好的方法?我创造了 验证此操作中每个操作的输入的方法的层次结构 控制器(因为不同操作的大多数输入实际上是重复的)如下 控制器中的私有方法 我已经创建了字符串生成器模式,每次我的请求都会使用所需的属性进行构建。这是最好的方式吗 我在控制器中加入了一些业务逻辑,但我不确定它是否应该在服务层中,

我正在设计一个将与另一个系统集成的api,但是我偶然发现了一个代码,我知道它可以改进,但我不知道如何正确地完成它

代码 要求 这是一个简单的操作,应该在响应内容中返回带有字符串的Ok

问题
  • 检查有效输入是否有更好的方法?我创造了 验证此操作中每个操作的输入的方法的层次结构 控制器(因为不同操作的大多数输入实际上是重复的)如下 控制器中的私有方法
  • 我已经创建了字符串生成器模式,每次我的请求都会使用所需的属性进行构建。这是最好的方式吗
  • 我在控制器中加入了一些业务逻辑,但我不确定它是否应该在服务层中,我应该这样做,还是从一个服务中调用一个方法,该服务本身执行所有逻辑,如果有错误或没有错误,只返回结果给我

    Example response would be:
    ...(some data)
    error_code=NoErrors\r\n
    error_message=There were no errors\r\n
    
  • 这是我的2美分:

    检查有效输入是否有更好的方法

    如果可能,将验证属性放在模型上进行基本验证。请看一个例子

    对于更多面向业务的验证,我认为应该在封装操作的方法中进行验证,这样您就可以检查客户限制和其他内容。如果出现错误,该方法可以抛出一个异常并发送有意义的消息,然后您可以捕获该异常,获取其消息并使用它构造响应

    我已经创建了字符串生成器模式,每次我的请求都会使用所需的属性进行构建。这是最好的方式吗

    正如您所说的,您需要一个字符串作为响应。但是有什么特别的格式吗?如果是,我建议将格式化逻辑放在一个地方

    我应该这样做,还是从一个服务中调用一个方法,该服务本身执行所有逻辑,如果有错误或没有错误,只向我返回结果

    Example response would be:
    ...(some data)
    error_code=NoErrors\r\n
    error_message=There were no errors\r\n
    
    典型的服务层应该关注业务验证和业务逻辑。也就是说,请求和原语验证的格式可以放在这个方法之外,但方法本身无论如何都应该验证传递的参数,并且不能依赖调用者正确地提供它们。然而,我应该注意到,这些问题是非常固执己见的,并且取决于特定的用例。有很多可能的方法,控制器没有理由成为代理,就像控制器没有理由膨胀一样


    此外,这可能会转到。

    为什么总是200 Ok?有404个NotFound,400个BadRequest等这是要求:(@SergeyBerezovskiy我认为每个API响应200实际上不是一件坏事。以Facebook API为例。OP不应该担心这一点。@kuskmen你的第二点是什么意思?你是在使用StringBuilder构建API返回的JSON、XML或其他数据格式吗?为什么不利用Web API auto自动格式化,而是在Ok()内返回一个对象?例如,类似于return Ok(Response.NoErrorResponse)的内容。NoErrorResponse可能包含您想要的属性,如ErrorDescription、ErrorCode等。我看不到result=new ReserverResponse()的任何用法;这是为了什么?为了评估方法的差异,开始按照您建议的方法进行重构,但这变成了另一个问题。如果出现问题,该方法可能会抛出带有有意义消息的异常,然后您可以捕获异常,获取其消息并使用它构造响应ld use
    try catch
    ?如果是,那么在哪里:控制器操作或服务方法?@adamshakhabov我的建议是:仅当您执行特定操作时,才显式使用try catch。否则,您可以使用筛选器或中间件捕获每个异常并显示其消息。因此,无论是在控制器中还是在服务中。有些人更喜欢将服务层中的每一个错误都封装在类似“CouldNotCreateUserException”的东西中,但我认为这是有争议的,不一定需要。