@@ -12,7 +12,7 @@ public sealed class DynamicGrpcClient : ClientBase
1212    private  readonly  DynamicFileDescriptorSet  _dynamicDescriptorSet ; 
1313    private  readonly  DynamicGrpcClientOptions  _options ; 
1414
15-     private  DynamicGrpcClient ( ChannelBase   channel ,  DynamicFileDescriptorSet  dynamicDescriptorSet ,  DynamicGrpcClientOptions  options )  :  base ( channel ) 
15+     private  DynamicGrpcClient ( CallInvoker   callInvoker ,  DynamicFileDescriptorSet  dynamicDescriptorSet ,  DynamicGrpcClientOptions  options )  :  base ( callInvoker ) 
1616    { 
1717        _dynamicDescriptorSet  =  dynamicDescriptorSet ; 
1818        _options  =  options ; 
@@ -43,9 +43,21 @@ public bool TryFindMethod(string serviceName, string methodName, [NotNullWhen(tr
4343    /// <param name="options">Options for this client.</param> 
4444    /// <returns>A dynamic client gRPC instance.</returns> 
4545    public  static DynamicGrpcClient  FromDescriptors ( ChannelBase  channel ,  FileDescriptor [ ]  descriptors ,  DynamicGrpcClientOptions ?  options  =  null ) 
46+     { 
47+         return  FromDescriptors ( channel . CreateCallInvoker ( ) ,  descriptors ,  options ) ; 
48+     } 
49+ 
50+     /// <summary> 
51+     /// Creates a client by using the specified <see cref="FileDescriptor"/>. The descriptors must appear in reverse dependency order (if A depends on B, B should comes first). 
52+     /// </summary> 
53+     /// <param name="callInvoker">The gRPC CallInvoker to fetch reflection data from.</param> 
54+     /// <param name="descriptors">The file descriptors./></param> 
55+     /// <param name="options">Options for this client.</param> 
56+     /// <returns>A dynamic client gRPC instance.</returns> 
57+     public  static DynamicGrpcClient  FromDescriptors ( CallInvoker  callInvoker ,  FileDescriptor [ ]  descriptors ,  DynamicGrpcClientOptions ?  options  =  null ) 
4658    { 
4759        options  ??=  new  DynamicGrpcClientOptions ( ) ; 
48-         return  new  DynamicGrpcClient ( channel ,  DynamicFileDescriptorSet . FromFileDescriptors ( descriptors ) ,  options ) ; 
60+         return  new  DynamicGrpcClient ( callInvoker ,  DynamicFileDescriptorSet . FromFileDescriptors ( descriptors ) ,  options ) ; 
4961    } 
5062
5163    /// <summary> 
@@ -56,9 +68,21 @@ public static DynamicGrpcClient FromDescriptors(ChannelBase channel, FileDescrip
5668    /// <param name="options">Options for this client.</param> 
5769    /// <returns>A dynamic client gRPC instance.</returns> 
5870    public  static DynamicGrpcClient  FromDescriptorProtos ( ChannelBase  channel ,  FileDescriptorProto [ ]  descriptorProtos ,  DynamicGrpcClientOptions ?  options  =  null ) 
71+     { 
72+         return  FromDescriptorProtos ( channel . CreateCallInvoker ( ) ,  descriptorProtos ,  options ) ; 
73+     } 
74+ 
75+     /// <summary> 
76+     /// Creates a client by using the specified <see cref="FileDescriptorProto"/>. The descriptors must appear in reverse dependency order (if A depends on B, B should comes first). 
77+     /// </summary> 
78+     /// <param name="callInvoker">The gRPC CallInvoker to fetch reflection data from.</param> 
79+     /// <param name="descriptorProtos">The file proto descriptors./></param> 
80+     /// <param name="options">Options for this client.</param> 
81+     /// <returns>A dynamic client gRPC instance.</returns> 
82+     public  static DynamicGrpcClient  FromDescriptorProtos ( CallInvoker  callInvoker ,  FileDescriptorProto [ ]  descriptorProtos ,  DynamicGrpcClientOptions ?  options  =  null ) 
5983    { 
6084        options  ??=  new  DynamicGrpcClientOptions ( ) ; 
61-         return  new  DynamicGrpcClient ( channel ,  DynamicFileDescriptorSet . FromFileDescriptorProtos ( descriptorProtos ) ,  options ) ; 
85+         return  new  DynamicGrpcClient ( callInvoker ,  DynamicFileDescriptorSet . FromFileDescriptorProtos ( descriptorProtos ) ,  options ) ; 
6286    } 
6387
6488    /// <summary> 
@@ -69,11 +93,24 @@ public static DynamicGrpcClient FromDescriptorProtos(ChannelBase channel, FileDe
6993    /// <param name="timeoutInMillis">Timeout in milliseconds. Default is 10000ms (10 seconds).</param> 
7094    /// <param name="cancellationToken">Optional cancellation token.</param> 
7195    /// <returns>A dynamic client gRPC instance.</returns> 
72-     public  static async  Task < DynamicGrpcClient >  FromServerReflection ( ChannelBase  channel ,  DynamicGrpcClientOptions ?  options  =  null ,  int  timeoutInMillis  =  10000 ,  CancellationToken  cancellationToken  =  default ) 
96+     public  static Task < DynamicGrpcClient >  FromServerReflection ( ChannelBase  channel ,  DynamicGrpcClientOptions ?  options  =  null ,  int  timeoutInMillis  =  10000 ,  CancellationToken  cancellationToken  =  default ) 
97+     { 
98+         return  FromServerReflection ( channel . CreateCallInvoker ( ) ,  options ,  timeoutInMillis ,  cancellationToken ) ; 
99+     } 
100+ 
101+     /// <summary> 
102+     /// Creates a client by fetching reflection data from the server. Might trigger an exception if the server doesn't support exception. 
103+     /// </summary> 
104+     /// <param name="callInvoker">The gRPC CallInvoker to fetch reflection data from.</param> 
105+     /// <param name="options">Options for this client.</param> 
106+     /// <param name="timeoutInMillis">Timeout in milliseconds. Default is 10000ms (10 seconds).</param> 
107+     /// <param name="cancellationToken">Optional cancellation token.</param> 
108+     /// <returns>A dynamic client gRPC instance.</returns> 
109+     public  static async  Task < DynamicGrpcClient >  FromServerReflection ( CallInvoker  callInvoker ,  DynamicGrpcClientOptions ?  options  =  null ,  int  timeoutInMillis  =  10000 ,  CancellationToken  cancellationToken  =  default ) 
73110    { 
74111        options  ??=  new  DynamicGrpcClientOptions ( ) ; 
75-         var  dynamicDescriptorSet  =  await  DynamicFileDescriptorSet . FromServerReflection ( channel ,  timeoutInMillis ,  cancellationToken ) ; 
76-         return  new  DynamicGrpcClient ( channel ,  dynamicDescriptorSet ,  options ) ; 
112+         var  dynamicDescriptorSet  =  await  DynamicFileDescriptorSet . FromServerReflection ( callInvoker ,  timeoutInMillis ,  cancellationToken ) ; 
113+         return  new  DynamicGrpcClient ( callInvoker ,  dynamicDescriptorSet ,  options ) ; 
77114    } 
78115
79116    /// <summary>Invokes a simple remote call in a blocking fashion.</summary> 
0 commit comments