使用 NSwag 和 AutoREST 创建一个代码客户端/展平控制器
Create one code client / flatten controllers with NSwag and AutoREST
我正在尝试使用 NSwag 和 Autorest 为 api 创建代码包装器。
之前我使用 Swashbuckle 生成 swagger 文件。它以 actionMethod
格式生成带有 operationIds 的 swagger 文件。这导致 Autorest 生成了一个深度为 1 的代码客户端。所有操作都在顶层 class.
由于各种原因,我需要将 swagger 生成更改为 NSwag。这会生成 controller_actionMethod
格式的 operationId。这导致 AutoRest 创建一个复合 class,它公开单独的 classes 以及每个控制器的操作。
怎么可能
- 更改 NSwag 生成 operationIds 的方式
- 更改 Autorest 映射 operationId 的方式
注意:我知道我可以手动更改 swagger.json,但我想保持一致的自动化过程来生成代码客户端。
似乎没有任何可用的设置,但您可以挂钩 NSwag 的生成过程
运算处理器
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());
不确定问问题时是否可用,但这里有一个非常简单的方法:
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
我正在尝试使用 NSwag 和 Autorest 为 api 创建代码包装器。
之前我使用 Swashbuckle 生成 swagger 文件。它以 actionMethod
格式生成带有 operationIds 的 swagger 文件。这导致 Autorest 生成了一个深度为 1 的代码客户端。所有操作都在顶层 class.
由于各种原因,我需要将 swagger 生成更改为 NSwag。这会生成 controller_actionMethod
格式的 operationId。这导致 AutoRest 创建一个复合 class,它公开单独的 classes 以及每个控制器的操作。
怎么可能
- 更改 NSwag 生成 operationIds 的方式
- 更改 Autorest 映射 operationId 的方式
注意:我知道我可以手动更改 swagger.json,但我想保持一致的自动化过程来生成代码客户端。
似乎没有任何可用的设置,但您可以挂钩 NSwag 的生成过程
运算处理器
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());
不确定问问题时是否可用,但这里有一个非常简单的方法:
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