public async Task PushAsync(string uri, string data)
        {
            var temporaryUri = Path.GetTempFileName();
            await storageController.PushAsync(temporaryUri, data);

            fileController.Move(temporaryUri, uri);
        }
        public async Task SerializePushAsync <T>(string uri, T data, IStatus status)
        {
            var serializedData = serializarionController.Serialize(data);

            var hash = await getStringHashAsyncDelegate.GetHashAsync(serializedData, status);

            var existingHash = await storedHashController.GetHashAsync(uri, status);

            // data has not changed, no need to write to storage
            if (hash == existingHash)
            {
                return;
            }

            await storedHashController.SetHashAsync(uri, hash, status);

            await storageController.PushAsync(uri, serializedData);
        }