自动从 Swagger 生成前端所需的 Type 和 Service

  1. 安装 dotnet tool
dotnet tool install --global Passingwind.Git-CI-Tools 
  1. 配置 swagger service
options.SchemaFilter<SwaggerEnumDescriptions>();
options.CustomSchemaIds(type =>
{
    if (type.IsGenericType)
    {
        var part1 = type.FullName.Substring(0, type.FullName.IndexOf("`")).RemovePostFix("Dto");
        var part2 = string.Concat(type.GetGenericArguments().Select(x => x.Name.RemovePostFix("Dto")));

        if (part1.EndsWith("ListResult") || part1.EndsWith("PagedResult"))
        {
            var temp1 = part1.Substring(0, part1.LastIndexOf("."));
            var temp2 = part1.Substring(part1.LastIndexOf(".") + 1);
            return $"{temp1}.{part2}{temp2}";
        }

        return $"{part1}.{part2}";
    }

    return type.FullName.RemovePostFix("Dto");
});

options.CustomOperationIds(e =>
{
    var action = e.ActionDescriptor.RouteValues["action"];
    var controller = e.ActionDescriptor.RouteValues["controller"];
    var method = e.HttpMethod;

    if (action == "GetList")
        return $"Get{controller}List";

    if (action == "GetAllList")
        return $"GetAll{controller}List";

    if (action.StartsWith("GetAll"))
        return $"GetAll{controller}{action.RemovePreFix("GetAll")}";

    if (action == ("Get") || action == ("Create") || action == ("Update") || action == ("Delete"))
        return action + controller;

    if (action.StartsWith("Get"))
        return $"Get{controller}{action.RemovePreFix("Get")}";

    if (action.StartsWith("Create"))
        return $"Create{controller}{action.RemovePreFix("Create")}";

    if (action.StartsWith("Update"))
        return $"Update{controller}{action.RemovePreFix("Update")}";

    if (action.StartsWith("Delete"))
        return $"Delete{controller}{action.RemovePreFix("Delete")}";

    if (action.StartsWith("BatchDelete"))
        return $"BatchDelete{controller}";

    if (method == "HttpGet")
        return action + controller;
    else
        return controller + action;
});

public class SwaggerEnumDescriptions : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        var type = context.Type;

        if (type.IsEnum)
        {
            var names = Enum.GetNames(type);

            var values2 = new OpenApiArray();

            values2.AddRange(names.Select(x => new OpenApiObject
            {
                ["name"] = new OpenApiString(Convert.ToInt32(Enum.Parse(type, x)).ToString()),
                ["value"] = new OpenApiString(x),
            }));

            var values1 = new OpenApiArray();
            values1.AddRange(names.Select(x => new OpenApiString(x)));

            schema.Extensions.Add(
                "x-enumNames",
                values1
            );

            schema.Extensions.Add(
                "x-ms-enum",
                new OpenApiObject
                {
                    ["name"] = new OpenApiString(type.Name),
                    ["modelAsString"] = new OpenApiBoolean(true),
                    ["values"] = values2,
                }
            );
        }
    }
}
  1. 使用。打开命令行工具
abptool gen fontend ts --swagger-url http://localhost:56876/swagger/v1/swagger.json --output xxxxxx\src\services\Biz

将会输出 services 和 types 文件。

已禁用评论。