Как правильно настроить автомат на полиморфизм - PullRequest
0 голосов
/ 19 июня 2020

У меня проблема с получением правильного определения OpenApi после обновления с 5.0.0 до 5.4.1

У нас был собственный фильтр полиморфизма с версией 5.0.0, но они не работают правильно с последней версией. Поэтому я удалил их и начал использовать GeneratePolymorphicSchemas (). Он делает то, что мне нужно для наших моделей polymorphi c, но не только для них. У нас также есть некоторые другие абстрактные и конкретные классы, в которых нам не нужен дискриминатор типов. Я пробовал разные конфигурации, но безуспешно. Либо сгенерированное определение неверно, либо я получаю ошибку в пользовательском интерфейсе swagger или ошибку сервера 503.

Ссылка на образец проекта Образец проекта

Вот мои полиморхи c модели

namespace SwashbuckleTest.Models
{
    public interface ITypeDiscriminator
    {
        string TypeDiscriminator { get; }
    }

    public abstract class SurveyStep : ITypeDiscriminator
    {
        public virtual string Id { get; set; }
        public string TypeDiscriminator => GetType().Name;
    }

    public abstract class SurveyStepResult : ITypeDiscriminator
    {
        public string Id { get; set; }

        public string TypeDiscriminator => GetType().Name;
    }

    public class BoolStep : SurveyStep
    {
        private string _id;

        public BoolStep()
        {
            ResultObject = new BoolStepResult();
        }

        public override string Id
        {
            get => _id;
            set
            {
                _id = value;
                ResultObject.Id = value;
            }
        }

        public string Question { get; set; }

        public BoolStepResult ResultObject { get; }
    }

    public class BoolStepResult : SurveyStepResult
    {
        public bool Value { get; set; }
    }
}

Здесь другие модели

namespace SwashbuckleTest.Models
{
    public abstract class SomeBaseModel
    {
        public string BaseValue { get; set; }
    }

    public class SomeConcreteModel : SomeBaseModel
    {
        public int ConcreteValue { get; set; }
    }
}

и конфигурации, которые я пробовал

options.UseAllOfToExtendReferenceSchemas();
options.GeneratePolymorphicSchemas(t =>
{
    var types = t.Is<SurveyStep>() ? new List<Type>() {typeof(BoolStep)}
        : t.Is<SurveyStepResult>() ? new List<Type>() {typeof(BoolStepResult)}
        : null;
    return types;
} , t => t.Is<ITypeDiscriminator>() ? nameof(ITypeDiscriminator.TypeDiscriminator).ToCamelCase() : null);

// or
options.GeneratePolymorphicSchemas(discriminatorSelector: t => t.Is<ITypeDiscriminator>() ? nameof(ITypeDiscriminator.TypeDiscriminator).ToCamelCase() : null);

1 Ответ

0 голосов
/ 30 июня 2020

Я обнаружил проблему сам.

Метод расширения Is<> не фильтрует абстрактные классы, поэтому мы получили бесконечную рекурсию.

Это помогло нам создать чванство. json, но у нас есть другие проблемы, которые немного глубже.

...