using Grpc.Extension.Common; using System; using System.Collections.Generic; using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Grpc.Core.Interceptors; using System.Linq; using Grpc.Core; using Grpc.Extension.Common.Internal; using Grpc.Extension.Client.Interceptors; using Grpc.Extension.Client.Internal; namespace Grpc.Extension.Client { /// /// GrpcClient,用于批量调用 /// public class GrpcClientManager { private IEnumerable _clientInterceptors; /// /// GrpcClient /// /// /// public GrpcClientManager(IServiceProvider serviceProvider, IEnumerable clientInterceptors) { ServiceProviderAccessor.SetServiceProvider(serviceProvider); this._clientInterceptors = clientInterceptors; } /// /// 获取GrpcClient,用于批量调用 /// /// /// public T GetGrpcClient() where T : ClientBase { var channelManager = ServiceProviderAccessor.GetService(); var bindFlags = BindingFlags.Static | BindingFlags.NonPublic; var grpcServiceName = typeof(T).DeclaringType.GetFieldValue("__ServiceName", bindFlags); var channel = channelManager.GetChannel(grpcServiceName); var callInvoker = channel.Intercept(_clientInterceptors.ToArray()); var client = Activator.CreateInstance(typeof(T), callInvoker); return client as T; } } }