コード例 #1
0
        private static IWorkflowInstance MaterializeWorkflowInstance(WorkflowInstanceDto workflowInstanceDto)
        {
            var workflowInstanceLock = new WorkflowInstanceLock(
                workflowInstanceDto.Lock.LockOwner.ToIdGuid(),
                workflowInstanceDto.Lock.LockMode,
                workflowInstanceDto.Lock.LockedAt.ToUniversalTime(),
                workflowInstanceDto.Lock.LockedUntil.ToUniversalTime());

            return(new WorkflowInstance(
                       workflowInstanceDto.WorkflowId.ToIdGuid(),
                       workflowInstanceDto.Id.ToIdGuid(),
                       workflowInstanceDto.RootWorkflowInstanceId.ToIdGuid(),
                       workflowInstanceDto.ParentWorkflowInstanceId.ToIdGuid(),
                       workflowInstanceDto.EntityType,
                       workflowInstanceDto.EntityId,
                       workflowInstanceLock)
            {
                Created = workflowInstanceDto.Created.ToUniversalTime(),
                CurrentStateCode = workflowInstanceDto.CurrentStateCode,
                CurrentStateProgress = workflowInstanceDto.CurrentStateProgress,
                EntityId = workflowInstanceDto.EntityId,
                EntityType = workflowInstanceDto.EntityType,
                WorkflowId = workflowInstanceDto.WorkflowId.ToIdGuid()
            });
        }
コード例 #2
0
        public async Task SaveWorkflowInstance(IWorkflowInstance workflowInstance, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNotNull(workflowInstance, nameof(workflowInstance));

            var workflowInstanceIdString = workflowInstance.Id.ToIdString();
            var mongoCollection          = MongoDatabase.GetCollection <WorkflowInstanceDto>(Constants.WorkflowInstanceCollectionName);
            var workflowInstanceDto      = mongoCollection.Find(x => x.Id == workflowInstanceIdString).FirstOrDefault();

            if (null == workflowInstanceDto)
            {
                workflowInstanceDto = new WorkflowInstanceDto
                {
                    Id                       = workflowInstance.Id.ToIdString(),
                    Created                  = new BsonDateTime(workflowInstance.Created),
                    CurrentStateCode         = workflowInstance.CurrentStateCode,
                    CurrentStateProgress     = workflowInstance.CurrentStateProgress,
                    EntityId                 = workflowInstance.EntityId,
                    EntityType               = workflowInstance.EntityType,
                    ParentWorkflowInstanceId = workflowInstance.ParentWorkflowInstanceId.ToIdString(),
                    RootWorkflowInstanceId   = workflowInstance.RootWorkflowInstanceId.ToIdString(),
                    WorkflowId               = workflowInstance.WorkflowId.ToIdString(),
                    Lock                     = new WorkflowInstanceLockDto
                    {
                        LockOwner   = workflowInstance.Lock.LockOwner.ToIdString(),
                        LockMode    = workflowInstance.Lock.LockMode,
                        LockedAt    = workflowInstance.Lock.LockedAt,
                        LockedUntil = workflowInstance.Lock.LockedUntil
                    }
                };

                await InsertAsync(mongoCollection, workflowInstanceDto, cancellationToken).ConfigureAwait(false);
            }
            else
            {
                // make sure not to update the whole entity to avoid conflicting updates on [Lock] sub-object
                var updateDefinition = Builders <WorkflowInstanceDto> .Update
                                       .Set(wi => wi.CurrentStateCode, workflowInstance.CurrentStateCode)
                                       .Set(wi => wi.CurrentStateProgress, workflowInstance.CurrentStateProgress)
                                       .Set(wi => wi.EntityId, workflowInstance.EntityId)
                                       .Set(wi => wi.EntityType, workflowInstance.EntityType)
                                       .Set(wi => wi.ParentWorkflowInstanceId, workflowInstance.ParentWorkflowInstanceId.ToIdString())
                                       .Set(wi => wi.RootWorkflowInstanceId, workflowInstance.RootWorkflowInstanceId.ToIdString())
                                       .Set(wi => wi.WorkflowId, workflowInstance.WorkflowId.ToIdString());

                await mongoCollection.UpdateOneAsync(wi => wi.Id == workflowInstanceIdString, updateDefinition, null, cancellationToken).ConfigureAwait(false);
            }
        }