Example #1
0
 private void RegisterResolverClassesMethods()
 {
     foreach (var module in _server.Modules)
     {
         foreach (var resClass in module.ResolverClasses)
         {
             var resClassInfo = new ResolverClassInfo()
             {
                 Module = module, Type = resClass
             };
             _model.ResolverClasses.Add(resClassInfo);
             var methods = resClass.GetPublicMethods();
             foreach (var m in methods)
             {
                 var resAttr = m.GetAttribute <ResolvesFieldAttribute>();
                 var resInfo = new ResolverMethodInfo()
                 {
                     Method     = m, Module = module, ResolverClass = resClassInfo, ReturnsTask = m.MethodReturnsTask(),
                     ReturnType = m.GetReturnDataType(), ResolvesAttribute = resAttr
                 };
                 if (resInfo.ReturnsTask)
                 {
                     resInfo.TaskResultReader = ExpressionHelper.CompileTaskResultReader(m.ReturnType);
                 }
                 _allResolverMethods.Add(resInfo);
             }
         }
     }
 }
 private bool VerifyFieldResolverMethod(FieldDef field, ResolverMethodInfo resolverMethod)
 {
     if (!VerifyResolverMethodReturnTypeCompatible(field, resolverMethod.Method))
     {
         return(false);
     }
     if (!ValidateResolverMethodArguments(field, resolverMethod))
     {
         return(false);
     }
     return(!_model.HasErrors);
 }
        private bool ValidateResolverMethodArguments(FieldDef fieldDef, ResolverMethodInfo resolverMethod)
        {
            var resMethod = resolverMethod.Method;
            // Check first parameter - must be IFieldContext
            var prms = resMethod.GetParameters();

            if (prms.Length == 0 || prms[0].ParameterType != typeof(IFieldContext))
            {
                AddError($"Resolver method {resMethod.GetFullRef()}: the first parameter must be of type '{nameof(IFieldContext)}'.");
                return(false);
            }
            // compare list of field parameters with list of resolver method parameters;
            //  resolver method has extra FieldContext and Parent parameters
            var argCountDiff = 1;

            if (!fieldDef.Flags.IsSet(FieldFlags.Static))
            {
                argCountDiff = 2;
            }
            var expectedPrmCount = fieldDef.Args.Count + argCountDiff;

            if (expectedPrmCount != prms.Length)
            {
                AddError($"Resolver method {resMethod.GetFullRef()}: parameter count mismatch with field arguments, expected {expectedPrmCount}, " +
                         "with added IFieldContext and possibly Parent object parameter. ");
                return(false);
            }
            // parameter names/types must be identical
            for (int i = argCountDiff; i < prms.Length; i++)
            {
                var prm = prms[i];
                var arg = fieldDef.Args[i - argCountDiff];
                if (prm.Name != arg.Name || prm.ParameterType != arg.ParamType)
                {
                    AddError($"Resolver method {resMethod.GetFullRef()}: parameter name/type mismatch with field argument; parameter: {prm.Name}.");
                    return(false);
                }
            }
            return(true);
        }