示例#1
0
        protected IWampRpcOperation CreateRpcMethod(object instance, ICalleeRegistrationInterceptor interceptor, MethodInfo method)
        {
            string procedureUri =
                interceptor.GetProcedureUri(method);

            if (!typeof(Task).IsAssignableFrom(method.ReturnType))
            {
                return(new SyncMethodInfoRpcOperation(instance, method, procedureUri));
            }
            else
            {
#if !NET40
                if (method.IsDefined(typeof(WampProgressiveResultProcedureAttribute)))
                {
                    MethodInfoValidation.ValidateProgressiveMethod(method);
                    return(CreateProgressiveOperation(instance, method, procedureUri));
                }
                else
#endif
                {
                    MethodInfoValidation.ValidateAsyncMethod(method);
                    return(new AsyncMethodInfoRpcOperation(instance, method, procedureUri));
                }
            }
        }
示例#2
0
        protected IWampRpcOperation CreateRpcMethod(Func <object> instanceProvider, ICalleeRegistrationInterceptor interceptor, MethodInfo method)
        {
            string procedureUri =
                interceptor.GetProcedureUri(method);

            if (method.ReturnType.IsGenericType && method.ReturnType.GetGenericTypeDefinition() == typeof(IObservable <>))
            {
                MethodInfoValidation.ValidateProgressiveObservableMethod(method);
                return(CreateProgressiveObservableOperation(instanceProvider, method, procedureUri));
            }
            else if (!typeof(Task).IsAssignableFrom(method.ReturnType))
            {
                MethodInfoValidation.ValidateSyncMethod(method);
                return(new SyncMethodInfoRpcOperation(instanceProvider, method, procedureUri));
            }
            else
            {
                if (method.IsDefined(typeof(WampProgressiveResultProcedureAttribute)))
                {
                    MethodInfoValidation.ValidateProgressiveMethod(method);
                    return(CreateProgressiveOperation(instanceProvider, method, procedureUri));
                }
                else
                {
                    MethodInfoValidation.ValidateAsyncMethod(method);
                    return(new AsyncMethodInfoRpcOperation(instanceProvider, method, procedureUri));
                }
            }
        }
示例#3
0
        private IEnumerable <OperationToRegister> GetServiceMethodsOfType
            (Func <object> instance,
            Type type,
            ICalleeRegistrationInterceptor interceptor)
        {
            foreach (var method in type.GetPublicInstanceMethods())
            {
                if (interceptor.IsCalleeProcedure(method))
                {
                    IWampRpcOperation operation = CreateRpcMethod(instance, interceptor, method);
                    RegisterOptions   options   = interceptor.GetRegisterOptions(method);

                    yield return(new OperationToRegister(operation, options));
                }
            }
        }
示例#4
0
        public IEnumerable <OperationToRegister> ExtractOperations(object instance, ICalleeRegistrationInterceptor interceptor)
        {
            Type type = instance.GetType();
            IEnumerable <Type> typesToExplore = GetTypesToExplore(type);

            foreach (Type currentType in typesToExplore)
            {
                IEnumerable <OperationToRegister> currentOperations =
                    GetServiceMethodsOfType(instance, currentType, interceptor);

                foreach (OperationToRegister operation in currentOperations)
                {
                    yield return(operation);
                }
            }
        }
        public Task <IAsyncDisposable> RegisterCallee(object instance, ICalleeRegistrationInterceptor interceptor)
        {
            IEnumerable <OperationToRegister> operationsToRegister =
                mExtractor.ExtractOperations(instance, interceptor);

            List <Task <IAsyncDisposable> > registrations =
                new List <Task <IAsyncDisposable> >();

            foreach (OperationToRegister operationToRegister in operationsToRegister)
            {
                Task <IAsyncDisposable> task =
                    mProxy.RpcCatalog.Register(operationToRegister.Operation, operationToRegister.Options);

                registrations.Add(task);
            }

            return(registrations.ToAsyncDisposableTask());
        }
        private static CompositeDisposable HostDisposableService(IWampHostedRealm hostedRealm, IDisposable service, ICalleeRegistrationInterceptor registrationInterceptor)
        {
            Task <IAsyncDisposable> registrationDisposable =
                hostedRealm.Services.RegisterCallee(service, registrationInterceptor);

            IAsyncDisposable asyncDisposable = registrationDisposable.Result;

            IDisposable unregisterDisposable =
                Disposable.Create(() => asyncDisposable.DisposeAsync().Wait());

            CompositeDisposable result =
                new CompositeDisposable(unregisterDisposable, service);

            return(result);
        }
示例#7
0
 public Task <IAsyncDisposable> RegisterCallee <TService>(Func <TService> instanceProvider,
                                                          ICalleeRegistrationInterceptor interceptor)
     where TService : class
 {
     return(RegisterCallee(typeof(TService), instanceProvider, interceptor));
 }
示例#8
0
 public Task <IAsyncDisposable> RegisterCallee(object instance, ICalleeRegistrationInterceptor interceptor)
 {
     return(RegisterCallee(instance.GetType(), () => instance, interceptor));
 }