コード例 #1
0
        private void SetRequestTimeout(MethodContext methodContext, ParameterExpression param, IConnectionParameters dbParameters)
        {
            var propInfo = DbContextProxyHelper.GetConnectionParamsProperty(param.Type);

            if (propInfo == null)
            {
                return;
            }

            var newDbConfig = Expression.New(typeof(ConnectionParameters).GetConstructor(new[] { typeof(IConnectionParameters) }), Expression.Constant(dbParameters));

            methodContext.Do(Expression.Assign(Expression.Property(param, propInfo), newDbConfig));
        }
コード例 #2
0
        private void GetBodyForMethod(MethodContext methodContext)
        {
            ParameterExpression param;
            var ret  = methodContext.Return(methodContext.TaskType);
            var task = methodContext.AddVariable(typeof(Task <IDataReader>), "task");

            var parameterConverter = StoredProcedureAttribute.GetConverter(Caller);

            if (parameterConverter == null)
            {
                throw new InvalidOperationException($"Could not get parameter converter for method {Caller.Name} of type {Caller.DeclaringType.FullName}");
            }

            if (parameterConverter is DefaultParameterConverter parameterConverterInternal)
            {
                param = parameterConverterInternal.Convert(methodContext, Parameters, Caller);
            }
            else
            {
                param = CustomConverter(methodContext, parameterConverter);
            }

            var dbConnectionParameters = Caller.GetCustomAttribute <DbConnectionParametersAttribute>();

            if (dbConnectionParameters != null)
            {
                SetRequestTimeout(methodContext, param, dbConnectionParameters);
            }

            var disp = methodContext.DispatcherMethod;

            var arguments = GetDispatcherAttributes(methodContext, param, disp);

            methodContext.Do(Expression.Assign(task,
                                               disp == null ?
                                               Expression.Call(ThisParameter, _nonDispatchedSpReaderWrapperMethodInfo, arguments) :
                                               Expression.Call(ThisParameter, disp, arguments)));

            var reader = GetReaderWrapper(methodContext);

            var action   = reader.Invoke(null, new object[0]);
            var proxType = action.GetType();
            var prox     = methodContext.AddVariable(proxType, "proxy");

            methodContext.Do(prox.Assign(action));

            var invokeProx = proxType.GetMethod("Invoke");

            methodContext.Do(ret.Assign(Expression.Call(prox, invokeProx, task)));
        }
コード例 #3
0
        private ParameterExpression CustomConverter(MethodContext methodContext, IParameterConverter parameterConverter)
        {
            var param = methodContext.AddVariable(typeof(object), "dispArgs");

            var dict = Expression.Variable(typeof(IDictionary <string, object>), "params");

            var dictInit = new List <Expression>
            {
                dict.Assign(Expression.Constant(new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase)))
            };

            foreach (var parameter in Parameters.Skip(1))
            {
                dictInit.Add(Expression.Call(dict, _dictAdd, Expression.Constant(parameter.Name), parameter));
            }

            dictInit.Add(Expression.Call(Expression.Constant(parameterConverter), StoredProcedureAttribute.Convert, dict));

            methodContext.Do(param.Assign(Expression.Block(param.Type, new[] { dict }, dictInit)));
            return(param);
        }
コード例 #4
0
        private List <Expression> GetDispatcherAttributes(MethodContext methodContext, ParameterExpression param, MethodInfo disp)
        {
            var arguments = new List <Expression>
            {
                methodContext.ActionNameConstant,
                param
            };

            if (disp == null ||
                disp.GetParameters().LastOrDefault()?.ParameterType == typeof(CancellationToken))
            {
                if (CancellationToken == null)
                {
                    arguments.Add(Expression.Constant(System.Threading.CancellationToken.None));
                }
                else
                {
                    arguments.Add(CancellationToken);
                }
            }

            return(arguments);
        }
コード例 #5
0
 protected abstract MethodInfo GetReaderWrapper(MethodContext context);
コード例 #6
0
 /// <inheritdoc />
 protected override MethodInfo GetReaderWrapper(MethodContext context)
 {
     return(_readerWrapperMethodInfo);
 }