【问题标题】:GraphQL.NET mutation with a List<Dictionary<string, string>> | JSON string带有 List<Dictionary<string, string>> 的 GraphQL.NET 突变 | JSON字符串
【发布时间】:2018-02-12 09:34:19
【问题描述】:

我想在我的服务器应用程序上注册alarms。为了防止传递 10 多个参数,我在客户端序列化我的 alarm 并将其作为 List&lt;JSONString&gt; 传递给我的服务器。反序列化它,注册它并给出注册alarm的答案。

现在我的问题是,我不知道如何传递这些参数:

使用变异 - DictionaryType

“类型为 \"[String]!\" 的变量 \"$params\" 用于期望类型 \"[DictionaryType]!\" 的位置。”

使用变异 - StringGraphType

"无法将值转换为 AST:System.Collections.Generic.Dictionary`2[System.String,System.Object]",**

服务器

变异 - 字典类型

public class Mutation : ObjectGraphType
{
    public Mutation()
    {
        Name = "Mutation";

        FieldAsync<HtStaticAlarmBaseType>(
            "registerStaticAlarms",
            "Register a list with static alarms.",
            arguments: new QueryArguments(
                new QueryArgument<NonNullGraphType<ListGraphType<DictionaryType>>> {Name = "params"}
            ),
            resolve: async context =>
            {
                List<object> parameterString = context.GetArgument<List<object>>("params");

                //TODO

                return null;
            }
        );
    }
}

变异 - 字典类型

public class Mutation : ObjectGraphType
{
    public Mutation()
    {
        Name = "Mutation";

        FieldAsync<HtStaticAlarmBaseType>(
            "registerStaticAlarms",
            "Register a list with static alarms.",
            arguments: new QueryArguments(
                new QueryArgument<NonNullGraphType<ListGraphType<StringGraphType>>> {Name = "params"}
            ),
            resolve: async context =>
            {
                List<object> parameterString = context.GetArgument<List<object>>("params");

                //TODO

                return null;
            }
        );
    }
}

字典类型

public class DictionaryType : ObjectGraphType<Dictionary<string,string>>
{
    public DictionaryType()
    {
        Name = "DictionaryType";
        Description = "Dictionary of type string, string.";
    }
}

HtStaticAlarmBaseType

public class HtStaticAlarmBaseType : ObjectGraphType<HtStaticAlarmBase>
{
    public HtStaticAlarmBaseType()
    {
        Name = "HtStaticAlarmBase";
        Description = "Base class of a static alarm.";


        // ##################################################
        // HtAlarmBase
        // ##################################################

        #region HtAlarmBase

        Field<StringGraphType>(
            "AlarmClass",
            resolve: context => context.Source.AlarmClass.ToString());

        Field<StringGraphType>(
            "AlarmGroup",
            resolve: context => context.Source.AlarmGroup);

        Field<IntGraphType>(
            "ErrorCode",
            resolve: context => (int)context.Source.ErrorCode);

        Field<StringGraphType>(
            "Id",
            resolve: context => context.Source.Id.ToString());

        Field<StringGraphType>(
            "Message",
            resolve: context => context.Source.Message);

        Field<StringGraphType>(
            "Station",
            resolve: context => context.Source.Station);

        Field<StringGraphType>(
            "TimeStampCome",
            resolve: context => context.Source.TimeStampCome?.ToString());

        Field<StringGraphType>(
            "TimeStampGone",
            resolve: context => context.Source.TimeStampGone?.ToString());

        Field<StringGraphType>(
            "TimeStampAcknowledge",
            resolve: context => context.Source.TimeStampAcknowledge?.ToString());

        Field<StringGraphType>(
            "Origin",
            resolve: context => context.Source.Origin);

        #endregion

        Field<IntGraphType>(
            "Number",
            resolve: context => context.Source.Number);

        Field<BooleanGraphType>(
            "Active",
            resolve: context => context.Source.Active);
    }
}

【问题讨论】:

    标签: c# graphql graphql-dotnet


    【解决方案1】:

    其实这是我目前的工作解决方案:

    客户端查询

    mutation RegisterStaticAlarms($params: [HtStaticAlarmInputType])
    {
        registerStaticAlarms(params: $params)
        {
            id,
            number,
            message,
            errorCode
        }
    }
    

    变异

    public class Mutation : ObjectGraphType
    {
        public Mutation()
        {
            Name = "Mutation";
    
            Field<ListGraphType<HtStaticAlarmType>>(
                "registerStaticAlarms",
                arguments: new QueryArguments(
                    new QueryArgument<ListGraphType<HtStaticAlarmInputType>>
                    {
                        Name = "params"
                    }
                ),
                resolve: context =>
                {
                    List<HtStaticAlarmInputTypeParams> paramses = context.GetArgument<List<HtStaticAlarmInputTypeParams>>("params");
    
                    List<HtStaticAlarmBase> list = new List<HtStaticAlarmBase>();
                    foreach (HtStaticAlarmInputTypeParams p in paramses)
                    {
                        list.Add(HtAlarmManager.Create(p.Origin, (EHtAlarmClassType)Enum.Parse(typeof(EHtAlarmClassType), p.AlarmClass.ToString()), p.AlarmGroup, p.Station, (HtErrorCode)Enum.Parse(typeof(HtErrorCode), p.ErrorCode.ToString()), p.Message, p.Number));
                    }
    
                    return list;
                }
            );            
        }
    }
    

    类型和型号

    /// <summary>
    /// GraphQl type of the <see cref="HtStaticAlarmBase"/>
    /// </summary>
    internal class HtStaticAlarmType : ObjectGraphType<HtStaticAlarmBase>
    {
        public HtStaticAlarmType()
        {
            Name = "HtStaticAlarmType";
            Description = "Base class of a static alarm.";
    
    
            // ##################################################
            // HtAlarmBase
            // ##################################################
    
            #region HtAlarmBase
    
            Field<StringGraphType>(
                "AlarmClass",
                resolve: context => context.Source.AlarmClass.ToString());
    
            Field<StringGraphType>(
                "AlarmGroup",
                resolve: context => context.Source.AlarmGroup);
    
            Field<IntGraphType>(
                "ErrorCode",
                resolve: context => (int)context.Source.ErrorCode);
    
            Field<StringGraphType>(
                "Id",
                resolve: context => context.Source.Id.ToString());
    
            Field<StringGraphType>(
                "Message",
                resolve: context => context.Source.Message);
    
            Field<StringGraphType>(
                "Station",
                resolve: context => context.Source.Station);
    
            Field<StringGraphType>(
                "TimeStampCome",
                resolve: context => context.Source.TimeStampCome?.ToString());
    
            Field<StringGraphType>(
                "TimeStampGone",
                resolve: context => context.Source.TimeStampGone?.ToString());
    
            Field<StringGraphType>(
                "TimeStampAcknowledge",
                resolve: context => context.Source.TimeStampAcknowledge?.ToString());
    
            Field<StringGraphType>(
                "Origin",
                resolve: context => context.Source.Origin);
    
            #endregion
    
            Field<IntGraphType>(
                "Number",
                resolve: context => context.Source.Number);
    
            Field<BooleanGraphType>(
                "Active",
                resolve: context => context.Source.Active);
        }
    }
    
    /// <summary>
    /// GraphQL input type of the <see cref="HtStaticAlarmBase"/>
    /// </summary>
    internal class HtStaticAlarmInputType : InputObjectGraphType
    {
        public HtStaticAlarmInputType()
        {
            Name = "HtStaticAlarmInputType";
            Description = "Base class of a static alarm.";
    
            // ##################################################
            // HtAlarmBase
            // ##################################################
    
            #region HtAlarmBase
    
            Field<IntGraphType>("AlarmClass");
            Field<StringGraphType>("AlarmGroup");
            Field<IntGraphType>("ErrorCode");
            Field<StringGraphType>("Id");
            Field<StringGraphType>("Message");
            Field<StringGraphType>("Station");
            Field<DateGraphType>("TimeStampCome");
            Field<DateGraphType>("TimeStampGone");
            Field<DateGraphType>("TimeStampAcknowledge");
            Field<StringGraphType>("Origin");
            Field<StringGraphType>("IsSynced");
            Field<StringGraphType>("Pending");
    
            #endregion
    
            Field<IntGraphType>("Number");
            Field<BooleanGraphType>("Active");            
        }
    }
    
    /// <summary>
    /// A lightweight class to deserialize the incoming <see cref="HtStaticAlarmInputType"/>
    /// </summary>
    internal class HtStaticAlarmInputTypeParams
    {
        public int AlarmClass { get; set; }
        public string AlarmGroup { get; set; }
        public int ErrorCode { get; set; }
        public string Message { get; set; }
        public string Station { get; set; }
        public DateTime TimeStampCome { get; set; }
        public DateTime TimeStampGone { get; set; }
        public DateTime TimeStampAcknowledge { get; set; }
        public string Origin { get; set; }
    
        public int Number { get; set; }
        public bool Active { get; set; }
    }
    

    预览

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多