using System; using System.Collections.Generic; using System.ServiceModel.Channels; using System.Text; using Grpc.Core; namespace Grpc.Extension.Client.Internal { /// /// 自动负载Channel的CallInvoker /// internal class AutoChannelCallInvoker : CallInvoker { private ChannelPool _channelManager; /// /// 自动负载Channel的CallInvoker /// public AutoChannelCallInvoker(ChannelPool channelManager) { this._channelManager = channelManager; } /// /// Invokes a simple remote call in a blocking fashion. /// public override TResponse BlockingUnaryCall(Method method, string host, CallOptions options, TRequest request) { var call = CreateCall(method, host, options); return Calls.BlockingUnaryCall(call, request); } /// /// Invokes a simple remote call asynchronously. /// public override AsyncUnaryCall AsyncUnaryCall(Method method, string host, CallOptions options, TRequest request) { var call = CreateCall(method, host, options); return Calls.AsyncUnaryCall(call, request); } /// /// Invokes a server streaming call asynchronously. /// In server streaming scenario, client sends on request and server responds with a stream of responses. /// public override AsyncServerStreamingCall AsyncServerStreamingCall(Method method, string host, CallOptions options, TRequest request) { var call = CreateCall(method, host, options); return Calls.AsyncServerStreamingCall(call, request); } /// /// Invokes a client streaming call asynchronously. /// In client streaming scenario, client sends a stream of requests and server responds with a single response. /// public override AsyncClientStreamingCall AsyncClientStreamingCall(Method method, string host, CallOptions options) { var call = CreateCall(method, host, options); return Calls.AsyncClientStreamingCall(call); } /// /// Invokes a duplex streaming call asynchronously. /// In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. /// The response stream is completely independent and both side can be sending messages at the same time. /// public override AsyncDuplexStreamingCall AsyncDuplexStreamingCall(Method method, string host, CallOptions options) { var call = CreateCall(method, host, options); return Calls.AsyncDuplexStreamingCall(call); } /// Creates call invocation details for given method. protected virtual CallInvocationDetails CreateCall(Method method, string host, CallOptions options) where TRequest : class where TResponse : class { var channel = _channelManager.GetChannel(method.ServiceName); return new CallInvocationDetails(channel, method, host, options); } } }