Rpc Call Proxy

来源:互联网 发布:python正则表达式语法 编辑:程序博客网 时间:2024/05/22 06:10

When communicate with Another System , for some reason need to :


1. log the time (calling time , etc)

2.Exception handling 


This is a RPC caller which handles exception in each call 


/// <summary>    /// Remote Procedure Call Proxy     /// Add log(timeline,etc) before/after RPC     /// Handle Remoting Call Exception     /// </summary>    /// <typeparam name="TIn"></typeparam>    public class EdasRpcProxy<TIn>    {        public delegate void ActionRef<TIn>(ref TIn parameter);        public static EdasResult SyncCallRef(ActionRef<TIn> func, ref TIn parameter)        {            return new EdasRpcProxy<TIn>().SynCRef(func, ref parameter);        }        public static EdasResult SyncCall(Action<TIn> action, TIn parameter)        {            return new EdasRpcProxy<TIn>().SynC(action, parameter);        }        private EdasResult SynCRef(ActionRef<TIn> func, ref TIn parameter)        {            try            {                func(ref parameter);                return EdasResult.Create(ResultCode.Ok);            }            catch (Exception ex)            {                return EdasResult.Create(ResultCode.RemoteServerErr,                    string.Format(eDASConstants.Messages.RpcCallError, func.Method.Name));            }        }        private EdasResult SynC(Action<TIn> action, TIn parameter)        {            try            {                action(parameter);                return EdasResult.Create(ResultCode.Ok);            }            catch (Exception ex)            {                return EdasResult.Create(ResultCode.RemoteServerErr,                    string.Format(eDASConstants.Messages.RpcCallError, action.Method.Name));            }        }        public void AsyncC<TOut>(Func<object, TOut> func, object parameter,      Action<EdasResult<TOut>> callback)        {            Task<TOut>.Factory.StartNew(func, parameter).ContinueWith(                (t =>                {                    var entity = t.Result;                    if (t.Exception != null)                        callback(EdasResult<TOut>.CreateResult(ResultCode.RemoteServerErr, default(TOut),                                                                 string.Format(eDASConstants.Messages.RpcCallError,                                                                 func.Method.Name)));                    else                        callback(EdasResult<TOut>.CreateResult(ResultCode.Ok, entity));                }));        }    }    public class EdasRpcProxy<TIn, TOut>    {        public delegate TOut FuncRef<TIn, TOut>(ref TIn parameter);        public static EdasResult<TOut> SyncCallRef(FuncRef<TIn, TOut> func, ref TIn parameter)        {            return new EdasRpcProxy<TIn, TOut>().SynCRef(func, ref parameter);        }        public static EdasResult<TOut> SyncCall(Func<TIn, TOut> func, TIn parameter)        {            return new EdasRpcProxy<TIn, TOut>().SynC(func, parameter);        }        private EdasResult<TOut> SynCRef(FuncRef<TIn, TOut> func, ref TIn parameter)        {            try            {                var ret = func(ref parameter);                return EdasResult<TOut>.CreateResult(ResultCode.Ok, ret);            }            catch (Exception ex)            {                return EdasResult<TOut>.CreateResult(ResultCode.RemoteServerErr, default(TOut),                    string.Format(eDASConstants.Messages.RpcCallError, func.Method.Name));            }        }        private EdasResult<TOut> SynC(Func<TIn, TOut> func, TIn parameter)        {            try            {                var ret = func(parameter);                return EdasResult<TOut>.CreateResult(ResultCode.Ok, ret);            }            catch (Exception ex)            {                return EdasResult<TOut>.CreateResult(ResultCode.RemoteServerErr, default(TOut),                    string.Format(eDASConstants.Messages.RpcCallError, func.Method.Name));            }        }    }


0 0