Example #1
0
        /// <summary>
        /// 从远程获取对象实例。
        /// </summary>
        /// <param name="parameter">获取前检索用的参数信息。</param>
        /// <param name="targetType">需要获取的最终类型。</param>
        /// <returns>符合条件的实例对象。</returns>
        public object GetObject(RemoteDataParameter parameter, Type targetType)
        {
            var uri = parameter.BuildUri();

            var method = "GetByOData";

            if (parameter.Executor == "Count" || parameter.Executor == "LongCount")
            {
                method = "CountByOData";
            }
            else if (parameter.Executor == "Any")
            {
                method = "AnyByOData";
            }

            var absoluteUrl = string.Format("{0}#{1}", Client.BaseAddress, method);

            if (parameter.Executor == "First" || parameter.Executor == "FirstOrDefault")
            {
                targetType = typeof(IQueryable <>).MakeGenericType(targetType);
            }

            var result = Client.GetAsync(method).FetchValue(targetType, "GET", absoluteUrl);

            if (parameter.Executor == "First" || parameter.Executor == "FirstOrDefault")
            {
                return((result as IEnumerable).OfType <object>().FirstOrDefault());
            }
            return(result);
        }
        /// <summary>
        /// Creates an array of Database compatible parameters from the provided array of parameters
        /// </summary>
        /// <param name="inputParams">the parameters that were provided by the client</param>
        /// <param name="connection">the connection that can be used to re-create parameters that were lost</param>
        /// <returns>an array of parameters that is compatible to the underlaying database connection</returns>
        private IDbDataParameter[] BuildParameters(IDbDataParameter[] inputParams, IDbWrapper connection)
        {
            IDbDataParameter[] retVal = null;
            if (parameters != null)
            {
                retVal = new IDbDataParameter[inputParams.Length];
                for (int i = 0; i < inputParams.Length; i++)
                {
                    RemoteDataParameter param = inputParams[i] as RemoteDataParameter;
                    if (param == null)
                    {
                        throw new InvalidOperationException(
                                  "Need to provide Parameters that were created by the connection!");
                    }

                    lock (this.parameters)
                    {
                        IDbDataParameter dbParam;
                        if (this.parameters.ContainsKey(param.ObjectId))
                        {
                            dbParam = this.parameters[param.ObjectId];
                        }
                        else
                        {
                            dbParam = connection.GetParameter(param.ParameterName, param.Value);
                        }

                        param.ApplyTo(dbParam);
                        retVal[i] = dbParam;
                    }
                }
            }

            return(retVal);
        }
Example #3
0
        public object Execute(Expression expression)
        {
            var dataParameter = new RemoteDataParameter();

            var methodCallExpression = expression as MethodCallExpression;

            dataParameter.Executor = methodCallExpression.Method.Name;

            var processor = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionProcessor>();

            processor.DataParameter = dataParameter;
            processor.Writer        = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionWriter>();

            processor.Build(methodCallExpression);

            return(DataFetcher.GetObject(dataParameter, methodCallExpression.Method.ReturnType));
        }
Example #4
0
        private string ReplenishURL(IMethodCallMessage methodCall)
        {
            var data       = new List <string>();
            var parameters = methodCall.MethodBase.GetParameters();

            for (int i = 0; i < methodCall.ArgCount; i++)
            {
                var argName   = methodCall.GetInArgName(i);
                var arg       = methodCall.GetInArg(i);
                var parameter = parameters.First(p => p.Name == argName);

                var binding = parameter.GetCustomAttribute <ParameterBindingAttribute>();
                if (binding == null)
                {
                    continue;
                }

                if (binding.BindingType == "Uri")
                {
                    data.Add(string.Format("{0}={1}", argName, Uri.EscapeUriString(ReferenceEquals(arg, null) ? "null" : arg.ToString())));
                }
                else if (binding.BindingType == "ODataParameter" && !ReferenceEquals(arg, null))
                {
                    var dataParameter = new RemoteDataParameter();

                    var processor = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionProcessor>();
                    processor.Writer        = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionWriter>();
                    processor.DataParameter = dataParameter;

                    processor.Build((arg as LambdaExpression).Body as MethodCallExpression);

                    data.Add(dataParameter.BuildUri());
                }
            }

            return(string.Join("&", data));
        }