public void InitializeInstanceContext(InstanceContext instanceContext, Message message, IContextChannel channel)
        {
            try
            {
                ActorId actorId    = GenericContext <ActorId> .Current.Value;
                Guid    instanceId = Guid.Empty;

                if (message.Headers.Action.Contains("Activate") == false)
                {
                    OperationDescription operation = instanceContext.Host.Description.Endpoints.SelectMany(endpoint => endpoint.Contract.Operations).FirstOrDefault(description => description.Name.Equals(message.Headers.Action.Split('/').Last()));
                    if (operation.IsInitiating == false)
                    {
                        throw new InvalidOperationException("Actor instance previously completed. Cannot use operation '" + operation.TaskMethod.Name + "' to activate new Actor state because it is marked as IsInitiating = false.");
                    }
                }

                m_PreviousProvider.InitializeInstanceContext(instanceContext, message, channel);
                instanceId = GetNewInstanceIdFromMessage(message);
                if (instanceId.Equals(Guid.Empty) == false)
                {
                    InitializingContext.Add(message.Headers);
                    SaveActorState(actorId, instanceId, instanceContext.Host.Description.ServiceType);
                }
            }
            finally
            {
                m_InstanceAccess.ReleaseMutex();
            }
        }
Ejemplo n.º 2
0
        public object GetInstance(InstanceContext instanceContext, Message message)
        {
            object serviceDurableInstance = m_ServiceDurableInstanceProvider.GetInstance(instanceContext, message);

            if (InitializingContext.Exists(message.Headers))
            {
                FieldInfo instance = serviceDurableInstance.GetType().GetField("instance", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                instance.SetValue(serviceDurableInstance, GetInstance(message.Headers, instanceContext.Host.Description.ServiceType));
            }
            return(serviceDurableInstance);
        }