GrpcClientManager.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using Grpc.Extension.Common;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using Grpc.Core.Interceptors;
  7. using System.Linq;
  8. using Grpc.Core;
  9. using Grpc.Extension.Common.Internal;
  10. using Grpc.Extension.Client.Interceptors;
  11. using Grpc.Extension.Client.Internal;
  12. namespace Grpc.Extension.Client
  13. {
  14. /// <summary>
  15. /// GrpcClient,用于批量调用
  16. /// </summary>
  17. public class GrpcClientManager
  18. {
  19. private IEnumerable<ClientInterceptor> _clientInterceptors;
  20. /// <summary>
  21. /// GrpcClient
  22. /// </summary>
  23. /// <param name="serviceProvider"></param>
  24. /// <param name="clientInterceptors"></param>
  25. public GrpcClientManager(IServiceProvider serviceProvider, IEnumerable<ClientInterceptor> clientInterceptors)
  26. {
  27. ServiceProviderAccessor.SetServiceProvider(serviceProvider);
  28. this._clientInterceptors = clientInterceptors;
  29. }
  30. /// <summary>
  31. /// 获取GrpcClient,用于批量调用
  32. /// </summary>
  33. /// <typeparam name="T"></typeparam>
  34. /// <returns></returns>
  35. public T GetGrpcClient<T>() where T : ClientBase<T>
  36. {
  37. var channelManager = ServiceProviderAccessor.GetService<ChannelPool>();
  38. var bindFlags = BindingFlags.Static | BindingFlags.NonPublic;
  39. var grpcServiceName = typeof(T).DeclaringType.GetFieldValue<string>("__ServiceName", bindFlags);
  40. var channel = channelManager.GetChannel(grpcServiceName);
  41. var callInvoker = channel.Intercept(_clientInterceptors.ToArray());
  42. var client = Activator.CreateInstance(typeof(T), callInvoker);
  43. return client as T;
  44. }
  45. }
  46. }