/// <inheritdoc />
        public virtual async Task <OperationContainer> ProcessAsync(OperationContainer operation, CancellationToken cancellationToken)
        {
            ArgumentGuard.NotNull(operation, nameof(operation));

            var       resource = (TResource)operation.Resource;
            TResource updated  = await _service.UpdateAsync(resource.Id, resource, cancellationToken);

            return(updated == null ? null : operation.WithResource(updated));
        }
        /// <inheritdoc />
        public virtual async Task <OperationContainer> ProcessAsync(OperationContainer operation,
                                                                    CancellationToken cancellationToken)
        {
            if (operation == null)
            {
                throw new ArgumentNullException(nameof(operation));
            }

            var resource = (TResource)operation.Resource;
            var updated  = await _service.UpdateAsync(resource.Id, resource, cancellationToken);

            return(updated == null ? null : operation.WithResource(updated));
        }
        /// <inheritdoc />
        public virtual async Task <OperationContainer> ProcessAsync(OperationContainer operation, CancellationToken cancellationToken)
        {
            ArgumentGuard.NotNull(operation, nameof(operation));

            TResource newResource = await _service.CreateAsync((TResource)operation.Resource, cancellationToken);

            if (operation.Resource.LocalId != null)
            {
                string          serverId        = newResource != null ? newResource.StringId : operation.Resource.StringId;
                ResourceContext resourceContext = _resourceContextProvider.GetResourceContext <TResource>();

                _localIdTracker.Assign(operation.Resource.LocalId, resourceContext.PublicName, serverId);
            }

            return(newResource == null ? null : operation.WithResource(newResource));
        }