/// <summary>
        /// Creates an <see cref="ActorProxy"/>
        /// </summary>
        /// <typeparam name="TActorInterface">The type of the actor to create</typeparam>
        /// <param name="actorId">The id of the actor to address</param>
        /// <param name="customHeaderProvider">A factory to create a <see cref="CustomHeaders"/> instance with data passed to the actor</param>
        /// <param name="applicationName"></param>
        /// <param name="serviceName"></param>
        /// <param name="listenerName"></param>
        /// <returns>An actor proxy object that implements IActorProxy and TActorInterface.</returns>
        public static TActorInterface Create <TActorInterface>(ActorId actorId, Func <CustomHeaders> customHeaderProvider, string applicationName = null, string serviceName = null, string listenerName = null) where TActorInterface : IActor
        {
            var methodNameProvider = new MethodNameProvider();

            var proxyFactory = new ActorProxyFactory(handler =>
                                                     new ExtendedServiceRemotingClientFactory(
                                                         new FabricTransportActorRemotingClientFactory(handler), customHeaderProvider, methodNameProvider));
            var proxy = proxyFactory.CreateActorProxy <TActorInterface>(actorId, applicationName, serviceName, listenerName);

            methodNameProvider.AddMethodsForProxyOrService(proxy.GetType().GetInterfaces(), typeof(IActor));
            return(proxy);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates an <see cref="ServiceProxy"/>
        /// </summary>
        /// <typeparam name="TServiceInterface">The type of service to create</typeparam>
        /// <param name="serviceUri">The uri of the service</param>
        /// <param name="customHeaderProvider">A factory to create a <see cref="CustomHeaders"/> instance with data passed to the service</param>
        /// <param name="partitionKey"></param>
        /// <param name="targetReplicaSelector"></param>
        /// <param name="listenerName"></param>
        /// <returns>A service proxy object that implements IServiceProxy and TServiceInterface.</returns>
        public static TServiceInterface Create <TServiceInterface>(Uri serviceUri, Func <CustomHeaders> customHeaderProvider,
                                                                   ServicePartitionKey partitionKey            = null,
                                                                   TargetReplicaSelector targetReplicaSelector = TargetReplicaSelector.Default, string listenerName = null)
            where TServiceInterface : IService
        {
            var methodNameProvider = new MethodNameProvider();

            var proxyFactory = new ServiceProxyFactory(handler =>
                                                       new ExtendedServiceRemotingClientFactory(
                                                           new FabricTransportServiceRemotingClientFactory(remotingCallbackMessageHandler: handler), customHeaderProvider, methodNameProvider));
            var proxy = proxyFactory.CreateServiceProxy <TServiceInterface>(serviceUri, partitionKey, targetReplicaSelector, listenerName);

            methodNameProvider.AddMethodsForProxyOrService(proxy.GetType().GetInterfaces(), typeof(IService));
            return(proxy);
        }
        public object Provide(object context)
        {
            InvokeMethod invoke = InvokeMethodInstance == null ? new InvokeMethod() : InvokeMethodInstance;

            if (TargetProvider != null)
            {
                invoke.TargetObject = TargetProvider.Provide(context);
            }
            if (MethodNameProvider != null)
            {
                invoke.MethodName = MethodNameProvider.Provide(context);
            }
            if (ArgumentProviders != null)
            {
                object[] args = new object[ArgumentProviders.Length];
                for (int i = 0; i < ArgumentProviders.Length; i++)
                {
                    args[i] = ArgumentProviders[i].Provide(context);
                }
                invoke.Arguments = args;
            }
            return(invoke.Provide(context));
        }