如何控制NSwag文档中包含的模型

问题描述 投票:0回答:1

我在ASP.NET Core 3.1 API中有2个区域,每个区域都有模型。我正在尝试生成2个草率的文档,每个文档都针对其区域。根据IOperationProcessor筛选操作,并且所有操作均正确。但是,每个文档都包含来自两个区域的所有文档。

如何控制哪个文档中包含哪些模型?

这是我目前所拥有的:

services.AddOpenApiDocument(swagger =>
{
    swagger.DocumentName = "admin";
    swagger.OperationProcessors.Add(new Swagger.AdminOperationProcessor());
    swagger.SchemaNameGenerator = new Swagger.SchemaNameGenerator();
});

services.AddOpenApiDocument(openApi =>
{
    openApi.DocumentName = "public";
    openApi.OperationProcessors.Add(new Swagger.PublicOperationProcessor());
    openApi.SchemaNameGenerator = new Swagger.SchemaNameGenerator();
    openApi.PostProcess = (x) =>
    {
    };
});
asp.net swagger asp.net-core-3.1 nswag
1个回答
0
投票

寻找年龄之后,我所要做的只是有些拙劣的解决方案。使用ISchemaNameGenerator将不需要的名称替换为其他名称(我将“。”替换为“ _”)。然后使用PostProcess将其从生成的架构中删除。由于某些原因,ExcludedTypeNames无法正常工作。

            var excludedList = new List<string>();

            // this is called first
            settings.SchemaNameGenerator = new SchemaNameGenerator(x =>
            {
                if (!typeNamespaces.Any(n => x.FullName.StartsWith(n)))
                {
                    excludedList.Add(x.FullName);
                }

                return !typeNamespaces.Any(n => x.FullName.StartsWith(n));
            });

            // Post process relies on excluded list, otherwise it won't work
            settings.PostProcess = (doc) =>
            {
                foreach (var exItem in excludedList)
                {
                    var formatted = exItem.Replace(".", "_");
                    if (doc.Definitions.ContainsKey(formatted))
                    {
                        doc.Definitions.Remove(formatted);
                    }
                }
            };

SchemaNameGenerator为:

public class SchemaNameGenerator : ISchemaNameGenerator
    {
        private Func<Type, bool> excludePredicate;

        public SchemaNameGenerator(Func<Type, bool> excludePredicate = null)
        {
            this.excludePredicate = excludePredicate;
        }

        public string Generate(Type type)
        {
            var displayAttr = type
                .GetCustomAttributes(typeof(DisplayNameAttribute), true)
                .Cast<DisplayNameAttribute>()
                .FirstOrDefault();

            if (excludePredicate != null)
            {
                if (excludePredicate(type))
                {
                    return type.FullName.Replace(".", "_");
                }
            }

            return displayAttr?.DisplayName ?? type.Name;
        }
    }

[如果有人有更好的主意,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.