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;
}
}
}