使用NSwag和AutoREST创建一个代码客户端/展平控制器

时间:2019-05-17 17:28:17

标签: swagger nswag autorest

我正在尝试使用NSwag和Autorest为api创建代码包装器。

以前,我是使用Swashbuckle生成swagger文件的。它生成了带有格式为actionMethod的operationId的swagger文件。这导致Autorest生成深度为1的代码客户端。所有操作都在顶级类上。

由于各种原因,我需要将摇摇欲坠的生成更改为NSwag。这将生成controller_actionMethod格式的operationIds。这样,AutoRest会创建一个复合类,该复合类公开每个控制器带有单独操作的类。

怎么可能

  • 更改NSwag生成operationId的方式
  • 更改Autorest映射operationId的方式

注意:我知道我可以手动更改swagger.json,但是我想保持一致的自动化过程来生成代码客户端。

2 个答案:

答案 0 :(得分:0)

似乎没有任何可用的设置,但是您可以加入NSwag的生成过程

https://github.com/RicoSuter/NSwag/wiki/Document-Processors-and-Operation-Processors#operation-processors

操作处理器

class FlattenOperationsProcessor: IOperationProcessor
{
    public async Task<bool> ProcessAsync(OperationProcessorContext context)
    {
        context.OperationDescription.Operation.OperationId = $"{context.MethodInfo.Name}";
        return true;
    }
}

然后将其添加到Startup.cs

document.OperationProcessors.Add(new FlattenOperationsProcessor());

答案 1 :(得分:0)

不确定在提出问题时是否可用,但这里有一个非常简单的方法:

services.AddSwaggerGen(c =>
{
    ...
    c.CustomOperationIds(d => d.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor ? controllerActionDescriptor.MethodInfo.Name : d.ActionDescriptor.AttributeRouteInfo?.Name);
});

同样也可以通过c.SwaggerGeneratorOptions.OperationIdSelector

设置

请注意,ActionDescriptor.AttributeRouteInfo?.Name 是我在源代码 here

中使用的默认值