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(); } }
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); }