/// <summary>
        /// This method has two responsibilities. 'Dual responsiblity principle' - it'll be all the rage in a few years.
        ///  1) To convert a {MethodInfo,arguments[]} pair into an RpcRequest object.
        ///  2) To pass the request object to a message broker correctly.
        /// </summary>
        public static object Call(this IRpcMessageBroker messageBroker, MethodInfo methodInfo, object[] arguments)
        {
            var interfaceName = methodInfo.DeclaringType?.AssemblyQualifiedName;

            if (interfaceName == null)
            {
                throw new ContractMismatchException("Maybe loosen off on the reflection and generics a bit?");
            }

            var request = new RpcRequest(
                Guid.NewGuid().ToString(),
                methodInfo.DeclaringType.AssemblyQualifiedName,
                methodInfo.GetRpcSignature(),
                arguments.Select(s_JsonSerializer.Serialize).ToArray());

            var async = methodInfo.GetCustomAttributes(typeof(RpcNonBlockingAttribute), true).Any();

            if (async)
            {
                messageBroker.BeginRequest(request, null);
                return(null);
            }

            var response = messageBroker.Send(request);

            if (methodInfo.ReturnType == typeof(void))
            {
                return(null);
            }
            return(s_JsonSerializer.Deserialize(methodInfo.ReturnType, response.ReturnValue));
        }
 internal SingleConnectionRpcClient(IRpcMessageBroker messageBroker)
 {
     if (messageBroker == null)
     {
         throw new ArgumentNullException(nameof(messageBroker));
     }
     m_MessageBroker = messageBroker;
 }
示例#3
0
 internal Connection(
     string connectionId,
     IRpcMessageBroker rpcMessageBroker,
     IEnumerable <IDisconnectReporter> disconnectReporters,
     IEnumerable <IDisposable> disposeChain)
 {
     m_Disposables    = new List <IDisposable>(disposeChain);
     ConnectionId     = connectionId;
     RpcMessageBroker = rpcMessageBroker;
     foreach (var reporter in disconnectReporters)
     {
         reporter.Disconnected += OnDisconnected;
     }
 }
示例#4
0
        public DuplexDelegateProvider(IDelegateCollection delegateCollection, IRpcMessageBroker rpcMessageBroker)
        {
            if (delegateCollection == null)
            {
                throw new ArgumentNullException(nameof(delegateCollection));
            }
            if (rpcMessageBroker == null)
            {
                throw new ArgumentNullException(nameof(rpcMessageBroker));
            }

            m_DelegateCollection = delegateCollection;
            m_RpcMessageBroker   = rpcMessageBroker;
        }
示例#5
0
        public RpcResponseChannelMessageHandler(
            IRpcMessageBroker rpcMessageBroker,
            IRpcMessageEncoder messageEncoder)
        {
            if (rpcMessageBroker == null)
            {
                throw new ArgumentNullException(nameof(rpcMessageBroker));
            }
            if (messageEncoder == null)
            {
                throw new ArgumentNullException(nameof(messageEncoder));
            }

            m_RpcMessageBroker = rpcMessageBroker;
            m_MessageEncoder   = messageEncoder;
        }