/// <summary> /// サービスメソッドを追加します。 /// </summary> /// <param name="builder">サービスビルダー</param> /// <param name="context">コンテキスト</param> private void AddServiceMethod(ServerServiceDefinition.Builder builder, MethodBuildContext context) { typeof(GrpcServiceBuilder).GetMethod("AddServiceMethodGeneric", BindingFlags.Instance | BindingFlags.NonPublic) .MakeGenericMethod(new Type[] { context.RequestType, context.ResponseType }) .Invoke(this, new object[] { builder, context }); }
/// <summary> /// サービスメソッドを追加します。 /// </summary> /// <typeparam name="TRequest">リクエストの型</typeparam> /// <typeparam name="TResponse">レスポンスの型</typeparam> /// <param name="builder">サービスビルダー</param> /// <param name="context">コンテキスト</param> private void AddServiceMethodGeneric <TRequest, TResponse>(ServerServiceDefinition.Builder builder, MethodBuildContext context) where TRequest : class where TResponse : class { Method <TRequest, TResponse> method = CreateServiceMethodFieldGeneric <TRequest, TResponse>(context); switch (method.Type) { case MethodType.Unary: builder.AddMethod <TRequest, TResponse>(method, CreateUnaryServerMethod <TRequest, TResponse>(context)); break; case MethodType.ClientStreaming: builder.AddMethod <TRequest, TResponse>(method, CreateClientStreamingServerMethod <TRequest, TResponse>(context)); break; case MethodType.ServerStreaming: builder.AddMethod <TRequest, TResponse>(method, CreateServerStreamingServerMethod <TRequest, TResponse>(context)); break; case MethodType.DuplexStreaming: builder.AddMethod <TRequest, TResponse>(method, CreateDuplexStreamingServerMethod <TRequest, TResponse>(context)); break; } }
/// <summary> /// サービスメソッド定義を生成します。 /// </summary> /// <typeparam name="TRequest">リクエストの型</typeparam> /// <typeparam name="TResponse">レスポンスの型</typeparam> /// <param name="context">コンテキスト</param> /// <returns>サービスメソッド定義></returns> private Method <TRequest, TResponse> CreateServiceMethodFieldGeneric <TRequest, TResponse>(MethodBuildContext context) { string serviceName = context.GetServiceName(); string methodName = context.GetServiceMethodName(); GrpcServerPerformanceListener performanceListener = context.NeedNotifyPerformanceLog ? context.Settings.PerformanceListener : null; Marshaller <TRequest> request = CreateMethodMarshaller <TRequest>(serviceName, methodName, performanceListener, context.Settings); Marshaller <TResponse> response = CreateMethodMarshaller <TResponse>(serviceName, methodName, performanceListener, context.Settings); return(new Method <TRequest, TResponse>(context.MethodType, serviceName, methodName, request, response)); }