Exemplo n.º 1
0
        private string[] CheckKeyParameters(ClrTypeInfo type, ParameterInfo[] paras)
        {
            var keys = type.Keys;

            if (paras.Length < keys.Length)
            {
                return(null);
            }
            var result = new string[keys.Length];

            for (int i = 0; i < keys.Length; i++)
            {
                var key  = keys[i];
                var para = paras[i];
                if (key.PropertyType != para.ParameterType)
                {
                    return(null);
                }
                if (!para.IsDefined(Constants.FromODataUri))
                {
                    var name = Constants.KeyParameterName;
                    if (keys.Length > 1)
                    {
                        name += key.Name;
                    }
                    if (para.Name != name)
                    {
                        return(null);
                    }
                }
                result[i] = para.Name;
            }
            return(result);
        }
Exemplo n.º 2
0
 /// <summary>
 /// 创建控制器信息体。
 /// </summary>
 /// <param name="clrtype">数据对象CLR类型信息。</param>
 /// <param name="controller">控制器类型。</param>
 /// <param name="name">控制器名称。</param>
 public ControllerInfo(ClrTypeInfo clrtype, Type controller, string name)
 {
     Methods          = new Dictionary <EControllerMethodKind, IControllerMethod>();
     Navigates        = new Dictionary <string, UnboundMethod>();
     BoundActions     = new Dictionary <string, BoundMethod>();
     UnboundActions   = new Dictionary <string, UnboundMethod>();
     BoundFunctions   = new Dictionary <string, BoundFunctionMethod>();
     UnboundFunctions = new Dictionary <string, UnboundFunctionMethod>();
     Name             = name;
     Initialization(clrtype, controller);
 }
Exemplo n.º 3
0
        private bool ProcessBodyMethod(ClrTypeInfo type, MethodInfo method, EControllerMethodKind kind)
        {
            var paras = method.GetParameters();

            if (paras.Length == 1 && paras[0].IsDefined(Constants.FromBody))
            {
                Methods.AddOrUpdate(kind, new BoundMethod(method));
                return(true);
            }
            return(false);
        }
Exemplo n.º 4
0
        private bool ProcessKeysMethod(ClrTypeInfo type, MethodInfo method, EControllerMethodKind kind)
        {
            var paras = method.GetParameters();
            var keys  = CheckKeyParameters(type, paras);

            if (keys != null && keys.Length == paras.Length)
            {
                Methods.AddOrUpdate(kind, new UnboundMethod(method, keys));
                return(true);
            }
            return(false);
        }
Exemplo n.º 5
0
        private bool ProcessKeysBodyMethod(ClrTypeInfo type, MethodInfo method, EControllerMethodKind kind)
        {
            var paras = method.GetParameters();
            var keys  = CheckKeyParameters(type, paras);

            if (keys != null && keys.Length == paras.Length)
            {
                if (paras.Length == keys.Length + 1 && paras[keys.Length].IsDefined(Constants.FromBody))
                {
                    Methods.AddOrUpdate(kind, new UnboundMethod(method, keys));
                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 6
0
        private bool ProcessRefMethod(ClrTypeInfo type, MethodInfo method)
        {
            var paras = method.GetParameters();

            if (paras.Length == 2 && paras[0].ParameterType == typeof(string) &&
                paras[1].IsDefined(Constants.FromBody))
            {
                var kind = method.Name == Constants.ActionCreateRef ? EControllerMethodKind.CreateRefBatch : EControllerMethodKind.DeleteRefBatch;
                Methods.AddOrUpdate(kind, new BoundFunctionMethod(method, paras[0].Name));
                return(true);
            }
            else
            {
                var keys = CheckKeyParameters(type, paras);
                if (keys != null)
                {
                    if (paras.Length == keys.Length + 1 && method.Name == Constants.ActionDeleteRef)
                    {
                        var para = paras[keys.Length];
                        if (para.ParameterType == typeof(string))
                        {
                            Methods.AddOrUpdate(EControllerMethodKind.DeleteRefObject, new UnboundFunctionMethod(method, keys, para.Name));
                            return(true);
                        }
                    }
                    else if (paras.Length == keys.Length + 2)
                    {
                        var navigate = paras[keys.Length];
                        var link     = paras[keys.Length + 1];
                        if (navigate.ParameterType == link.ParameterType && link.ParameterType == typeof(string))
                        {
                            var kind = method.Name == Constants.ActionCreateRef ? EControllerMethodKind.CreateRef : EControllerMethodKind.DeleteRef;
                            Methods.AddOrUpdate(kind, new UnboundFunctionMethod(method, keys, navigate.Name, link.Name));
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
Exemplo n.º 7
0
        private void Initialization(ClrTypeInfo type, Type controllerType)
        {
            var methods = controllerType.GetMethods();

            foreach (var method in methods)
            {
                var name  = method.Name;
                var paras = method.GetParameters();
                if (name == Constants.ActionCreateRef || name == Constants.ActionDeleteRef)
                {
                    if (ProcessRefMethod(type, method))
                    {
                        continue;
                    }
                }
                else if (name == Constants.ActionPrefixGet || name == Constants.ActionPrefixGet + Name)
                {
                    if (paras.Length == 0)
                    {
                        Methods.AddOrUpdate(EControllerMethodKind.GetItems, new BoundMethod(method));
                        continue;
                    }
                    if (ProcessKeysMethod(type, method, EControllerMethodKind.GetItem))
                    {
                        continue;
                    }
                }
                else if (name == Constants.ActionPrefixPost || name == Constants.ActionPrefixPost + Name)
                {
                    if (ProcessBodyMethod(type, method, EControllerMethodKind.PostItems))
                    {
                        continue;
                    }
                }
                else if (name == Constants.ActionPrefixPut || name == Constants.ActionPrefixPut + Name)
                {
                    if (ProcessBodyMethod(type, method, EControllerMethodKind.PutItems) ||
                        ProcessKeysBodyMethod(type, method, EControllerMethodKind.PutItem))
                    {
                        continue;
                    }
                }
                else if (name == Constants.ActionPrefixDelete || name == Constants.ActionPrefixDelete + Name)
                {
                    if (ProcessBodyMethod(type, method, EControllerMethodKind.DeleteItems) ||
                        ProcessKeysMethod(type, method, EControllerMethodKind.DeleteItem))
                    {
                        continue;
                    }
                }
                else if (name.StartsWith("Get"))
                {
                    var subname = name.Substring(3);
                    if (type.Navigates.ContainsKey(subname))
                    {
                        var keys = CheckKeyParameters(type, paras);
                        if (keys != null && keys.Length == paras.Length)
                        {
                            Navigates.AddOrUpdate(subname, new UnboundMethod(method, keys));
                            continue;
                        }
                    }
                }

                if (method.IsDefined(Constants.HttpGet))
                {
                    var keys = CheckKeyParameters(type, paras);
                    if (keys != null)
                    {
                        var names = new string[paras.Length - keys.Length];
                        for (int i = 0; i < names.Length; i++)
                        {
                            names[i] = paras[keys.Length + i].Name;
                        }
                        UnboundFunctions.AddOrUpdate(method.Name, new UnboundFunctionMethod(method, keys));
                    }
                    else
                    {
                        BoundFunctions.AddOrUpdate(method.Name, new BoundFunctionMethod(method, paras.Select(a => a.Name).ToArray()));
                    }
                }
                else if (method.IsDefined(Constants.HttpPost))
                {
                    var keys = CheckKeyParameters(type, paras);
                    if (keys != null)
                    {
                        UnboundActions.AddOrUpdate(method.Name, new UnboundMethod(method, keys));
                    }
                    else
                    {
                        BoundActions.AddOrUpdate(method.Name, new BoundMethod(method));
                    }
                }
            }
        }