Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
 protected abstract void AddEventHandlerDefinition <TEventArgs>(
     RpcEventInfo eventInfo,
     Func <RpcObjectRequest, IServiceProvider?, IRpcAsyncStreamWriter <TEventArgs>, IRpcContext, ValueTask> beginEventProducer,
     RpcStub <TService> serviceStub,
     TMethodBinder binder)
     where TEventArgs : class;
Exemplo n.º 6
0
        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);
        }