Как управлять моделями, включенными в документ NSwag - PullRequest
0 голосов
/ 01 апреля 2020

В моем ASP. NET Core 3.1 API есть две области и модели в каждой из них. Я пытаюсь произвести 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) =>
    {
    };
});

1 Ответ

0 голосов
/ 02 апреля 2020

После того, как я искал целую вечность, мне пришлось немного испортить решение. Используя 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;
        }
    }

Если у кого-то есть идея получше, пожалуйста, дайте мне знать.

...