Используйте обобщенный класс с graphql в ядре .net - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в GraphQL , я делаю небольшой веб-сайт, предназначенный для управления студентами и классами.

В моем приложении у меня есть общий класс:

public class RangeModel<TFrom, TTo>
    {
        #region Propertes

        public TFrom From { get; set; }

        public TTo To { get; set; }

        #endregion
    }

Этот класс предназначен для определения диапазона с универсальным типом данных.Диапазон может быть:

RangeModel<double?, double?>

RangeModel<int?, int?>

... и т. Д.

Я пытался создать класс RangeModelTypeкоторый наследует ObjectGraphType:

    public class RangeModelType<TFrom, TTo>: InputObjectGraphType<RangeModel<TFrom, TTo>>
        {
            public RangeModelType()
            {
                Field(x => x.From).Description("Minimum range");
                Field(x => x.To).Description("Maximum range");
            }
        }

И определил мой запрос, как показано ниже:

var studentsQueryArguments = new QueryArguments();
            studentsQueryArguments.Add(new QueryArgument<ListGraphType<IntGraphType>> { Name = "ids", Description = "Student indexes." });
            studentsQueryArguments.Add(new QueryArgument<ObjectGraphType<RangeModelType<double?, double?>>>{Name = "age", Description = "Age range of student."});
            Field<ListGraphType<StudentType>>(
                "students",
                arguments: studentsQueryArguments,
                resolve: context =>
                {
                    // Resolve data...
                    return results;
                });
        }

Когда я запустил свое приложение и выполнил запрос.Было отброшено одно исключение, которое сообщило:

Невозможно привести объект типа GraphQL.Types.ObjectGraphType1 [GraphQlStudy.Models.GraphQL.Types.RangeModelType2 [System.Nullable1 [System.Double], System.Nullable1 [System.Double]]] 'для ввода' GraphQL.Types.ScalarGraphType '.

Я искал учебники, которые используют GraphQL и универсальный класс, но ничего не упоминает об использовании такого рода универсальныхкласс.

Кто-нибудь может мне помочь?

Спасибо,

1 Ответ

0 голосов
/ 30 октября 2018

После нескольких часов у меня есть следующее решение.

  1. Определить RangeModel.cs как:

    public class RangeModel<TFrom, TTo>
    {
        public TFrom From { get; set; }
    
        public TTo To { get; set; }
    }
    
  2. Определить RangeModelType.cs:

    public class RangeModelType<TFrom, TTo> : InputObjectGraphType<RangeModel<TFrom, TTo>>
    {
        public RangeModelType()
        {
            var fromType = typeof(TFrom);
            Field(x => x.From, fromType.IsGenericType && fromType.GetGenericTypeDefinition() == typeof(Nullable<>));
    
            var toType = typeof(TTo);
            Field(x => x.To, toType.IsGenericType && toType.GetGenericTypeDefinition() == typeof(Nullable<>));
        }
    }
    
  3. Это мой запросный аргумент:

    studentsQueryArguments.Add(new QueryArgument<RangeModelType<double?, double?>> {Name = "age", Description = "Age range of student."});
    

Я не знаю, хороша ли эта реализация или нет. Пока это решает мою проблему.

Надеюсь, эта помощь.

...