private async Task ProcessEvent <TService>(string msgText, IBasicProperties basicProperties, IEnumerable <TService> svcs) where TService : class { //var eventName = orginalMsg.RoutingKey; var type = typeof(TService); var msg = QuRegulation.Transfer.ToObject <QuMsg>(msgText); //type.GetInterfaces var methodInfo = type.FindIncludBaseType <MethodInfo>(t => t.GetMethod(msg.MethodName)); var paramInfos = methodInfo.GetParameters(); var methodparams = new object[paramInfos.Length]; for (int i = 0; i < paramInfos.Length; i++) { var paramType = paramInfos[i].ParameterType; var jobject = msg.Params[i] as JObject; methodparams[i] = (jobject == null)? msg.Params[i]: jobject.ToObject(paramType); } foreach (var svc in svcs) { //methodInfo.Invoke(svc, methodparams); if (string.IsNullOrEmpty(basicProperties.ReplyTo)) { await Task.Run(() => methodInfo.Invoke(svc, methodparams)).ConfigureAwait(false); } else { object rlt = await Task <object> .Run(() => methodInfo.Invoke(svc, methodparams)).ConfigureAwait(false); //IQuCorrleation quRlt = (typeof(IQuCorrleation).IsAssignableFrom(methodInfo.ReturnType)) // ? rlt as IQuCorrleation // : new QuResult<object>(rlt); //quRlt.CorrleationId= orginalMsg.BasicProperties.CorrelationId; rlt = (typeof(QuResult).IsAssignableFrom(methodInfo.ReturnType)) ? ((QuResult)rlt).Value :rlt; QuMsg repMsg = new QuMsg(new object[] { basicProperties.CorrelationId, rlt }); //repMsg.CorrleationId = orginalMsg.BasicProperties.CorrelationId; repMsg.MethodName = nameof(IQuResponseService.ReceiveResponse); //Channel.QueueDeclare(orginalMsg.BasicProperties.ReplyTo, queueSpec.Durable, queueSpec.Exclusive, queueSpec.AutoDelete, null); var rspMessage = QuRegulation.Transfer.ToText(repMsg);//JsonConvert.SerializeObject(msg); var body = Encoding.UTF8.GetBytes(rspMessage); using (var channel = Conn.Entity.Create()) channel.Entity.BasicPublish("", basicProperties.ReplyTo, null, body); } } }
private IQuCorrleation RegistQuReslut(MethodInfo methodInfo, QuSpecAttribute queueSpec, QuMsg msg, out bool immediatelyWaitRasult) { immediatelyWaitRasult = !typeof(IQuCorrleation).IsAssignableFrom(methodInfo.ReturnType); //if (immediatelyWaitRasult) return null; //var type=typeof(QuResult<>).MakeGenericType(methodInfo.ReturnType.GetGenericArguments()); IQuCorrleation quRlt = (immediatelyWaitRasult)?new QuResult(): Activator.CreateInstance(methodInfo.ReturnType) as IQuCorrleation; quRlt.CorrleationId = string.IsNullOrEmpty(msg.CorrleationId)?msg.Id:msg.CorrleationId; //quResultMap ??= new Dictionary<string, IQuCorrleation>(); //lock (this) // quResultMap[quRlt.CorrleationId] = quRlt; return(quRlt); }