예제 #1
0
        private async Task LocalExecute(InvokeMessage invokeMessage, ResultMessage result)
        {
            try
            {
                _logger.LogDebug(JsonConvert.SerializeObject(invokeMessage));
                var service    = _entryFactory.Find(invokeMessage.ServiceId);
                var args       = new List <object>();
                var parameters = invokeMessage.Parameters ?? new Dictionary <string, object>();
                foreach (var parameter in service.GetParameters())
                {
                    if (parameters.ContainsKey(parameter.Name))
                    {
                        var parameterType = parameter.ParameterType;
                        var arg           = parameters[parameter.Name].CastTo(parameterType);
                        args.Add(arg);
                    }
                    else
                    {
                        args.Add(parameter.DefaultValue);
                    }
                }

                var instance = _provider.GetService(service.DeclaringType);
                var data     = service.Invoke(instance, args.ToArray());
                if (!(data is Task task))
                {
                    result.Data = data;
                }
                else
                {
                    await task;
                    var   taskType = task.GetType().GetTypeInfo();
                    if (taskType.IsGenericType)
                    {
                        var prop = taskType.GetProperty("Result");
                        if (prop != null)
                        {
                            result.Data = prop.GetValue(task);
                        }
                    }
                }
            }
예제 #2
0
        private async Task LocalExecute(InvokeMessage invokeMessage, ResultMessage result)
        {
            try
            {
                if (_logger.IsEnabled(LogLevel.Debug))
                {
                    _logger.LogDebug(JsonConvert.SerializeObject(invokeMessage));
                }
                var entry = _entryFactory.Find(invokeMessage.ServiceId);

                if (entry.IsNotify)
                {
                    await entry.Invoke(invokeMessage.Parameters);
                }
                else
                {
                    var data = await entry.Invoke(invokeMessage.Parameters);

                    if (!(data is Task task))
                    {
                        result.Data = data;
                    }
                    else
                    {
                        await task;
                        var   taskType = task.GetType().GetTypeInfo();
                        if (taskType.IsGenericType)
                        {
                            var prop = taskType.GetProperty("Result");
                            if (prop != null)
                            {
                                result.Data = prop.GetValue(task);
                            }
                        }
                    }
                }