Rpc Call Proxy

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值