protected override void AddEventHandlerDefinition <TEventArgs>( RpcEventInfo eventInfo, Func <RpcObjectRequest, IServiceProvider?, IRpcAsyncStreamWriter <TEventArgs>, IRpcContext, ValueTask> beginEventProducer, RpcStub <TService> serviceStub, IGrpcMethodBinder binder) { GrpcCore.ServerStreamingServerMethod <RpcObjectRequest, TEventArgs> handler = (request, responseStream, context) => { using (var scope = CreateServiceScope(serviceStub)) { return(beginEventProducer(request, scope?.ServiceProvider, new GrpcAsyncStreamWriter <TEventArgs>(responseStream), new GrpcCallContext(context)).AsTask()); } }; var beginEventProducerName = $"Begin{eventInfo.Name}"; binder.AddMethod( GrpcMethodDefinition.Create <RpcObjectRequest, TEventArgs>( GrpcCore.MethodType.ServerStreaming, eventInfo.FullServiceName, beginEventProducerName, serviceStub.Serializer), handler); }
protected override void AddEventHandlerDefinition <TEventArgs>( RpcEventInfo eventInfo, Func <RpcObjectRequest, IServiceProvider?, IRpcAsyncStreamWriter <TEventArgs>, IRpcContext, ValueTask> beginEventProducer, RpcStub <TService> serviceStub, ILightweightMethodBinder binder) { var beginEventProducerName = $"{eventInfo.FullServiceName}.Begin{eventInfo.Name}"; var methodStub = new LightweightStreamingMethodStub <RpcObjectRequest, TEventArgs>(beginEventProducerName, beginEventProducer, serviceStub.Serializer, null); binder.AddMethod(methodStub); }
internal void AddEventHandler(RpcStub <TService> serviceStub, RpcEventInfo eventInfo, TMethodBinder binder) { if (typeof(EventHandler).Equals(eventInfo.Event.EventHandlerType)) { this.AddPlainEventHandler(serviceStub, eventInfo, binder); return; } // TODO: Cache. var addEventHandlerDelegate = (Action <RpcStub <TService>, RpcEventInfo, TMethodBinder>) GetBuilderMethod(nameof(this.AddGenericEventHandler)) .MakeGenericMethod(eventInfo.EventArgsType) .CreateDelegate(typeof(Action <RpcStub <TService>, RpcEventInfo, TMethodBinder>), this); addEventHandlerDelegate(serviceStub, eventInfo, binder); }
protected override void AddEventHandlerDefinition <TEventArgs>( RpcEventInfo eventInfo, Func <RpcObjectRequest, IServiceProvider?, IRpcAsyncStreamWriter <TEventArgs>, IRpcContext, ValueTask> beginEventProducer, RpcStub <TService> serviceStub, INetGrpcBinder <TService> binder) { ServerStreamingServerMethod <NetGrpcServiceActivator <TService>, RpcObjectRequest, TEventArgs> handler = (activator, request, responseStream, context) => beginEventProducer(request, activator.ServiceProvider, new GrpcAsyncStreamWriter <TEventArgs>(responseStream), new GrpcCallContext(context)).AsTask(); var beginEventProducerName = $"Begin{eventInfo.Name}"; binder.AddServerStreamingMethod( GrpcMethodDefinition.Create <RpcObjectRequest, TEventArgs>( MethodType.ServerStreaming, eventInfo.FullServiceName, beginEventProducerName, serviceStub.Serializer), eventInfo.Metadata, handler); }
protected abstract void AddEventHandlerDefinition <TEventArgs>( RpcEventInfo eventInfo, Func <RpcObjectRequest, IServiceProvider?, IRpcAsyncStreamWriter <TEventArgs>, IRpcContext, ValueTask> beginEventProducer, RpcStub <TService> serviceStub, TMethodBinder binder) where TEventArgs : class;
internal void AddGenericEventHandler <TEventArgs>(RpcStub <TService> serviceStub, RpcEventInfo eventInfo, TMethodBinder binder) where TEventArgs : class { if (eventInfo.Event.EventHandlerType == null || eventInfo.Event.AddMethod == null || eventInfo.Event.RemoveMethod == null) { throw new NotSupportedException($"Service event handler for '{eventInfo.DeclaringMember.Name}' must be full defined."); } var serviceParameter = Expression.Parameter(typeof(TService)); var delegateParameter = Expression.Parameter(typeof(Delegate)); var castDelegateExpression = Expression.Convert(delegateParameter, eventInfo.Event.EventHandlerType); var addHandlerExpression = Expression.Call(serviceParameter, eventInfo.Event.AddMethod, castDelegateExpression); var addHandlerAction = Expression.Lambda <Action <TService, Delegate> >(addHandlerExpression, serviceParameter, delegateParameter).Compile(); var removeHandlerExpression = Expression.Call(serviceParameter, eventInfo.Event.RemoveMethod, castDelegateExpression); var removeHandlerAction = Expression.Lambda <Action <TService, Delegate> >(removeHandlerExpression, serviceParameter, delegateParameter).Compile(); ValueTask LocalBeginEventProducer(RpcObjectRequest request, IServiceProvider?serviceProvider, IRpcAsyncStreamWriter <TEventArgs> responseStream, IRpcContext context) { var eventProducer = new GenericEventHandlerProducer <TEventArgs>(responseStream, addHandlerAction, removeHandlerAction, context.CancellationToken); return(serviceStub.BeginEventProducer(request, serviceProvider, eventProducer)); } this.AddEventHandlerDefinition <TEventArgs>(eventInfo, LocalBeginEventProducer, serviceStub, binder); }