示例#1
0
        // T can be any type that derived from BaseResult and results are not change tracked
        // method could be used if we dont want to change track T here
        public async Task <ICommandResult <T> > RequestMergedResult <T>(object data = null)
        {
            DistinctCommandResult <T> result = new DistinctCommandResult <T>();
            var response = await SendCommandAsync(data).ConfigureAwait(false);

            using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
            {
                var serializer = new DocumentSerializer(db);

                result.Result     = serializer.Deserialize <T>(stream);
                result.BaseResult = result.Result as BaseResult;
            }

            new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult);

            return(result);
        }
示例#2
0
        // T can be any type
        // method should be used when base result is provided on server errors
        public async Task <ICommandResult <T> > RequestDistinctResult <T>(object data = null, Func <StreamWriter, Task> onStreamReady = null, bool?throwForServerErrors = null)
        {
            DistinctCommandResult <T> result = new DistinctCommandResult <T>();

            HttpResponseMessage response = null;

            if (onStreamReady == null)
            {
                response = await SendCommandAsync(data).ConfigureAwait(false);
            }
            else
            {
                response = await SendStreamCommandAsync(onStreamReady).ConfigureAwait(false);
            }

            var serializer = new DocumentSerializer(db);

            using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
            {
                if (EnableChangeTracking)
                {
                    JObject jObject = null;
                    result.Result = response.IsSuccessStatusCode ? serializer.DeserializeSingleResult <T>(stream, out jObject) : default(T);
                    if (response.IsSuccessStatusCode)
                    {
                        db.ChangeTracker.TrackChanges(result.Result, jObject);
                    }
                }
                else
                {
                    result.Result = response.IsSuccessStatusCode ? serializer.Deserialize <T>(stream) : default(T);
                }

                // response has not BaseResult if If-None-Match point to a match revision (status: HttpStatusCode.NotModified)
                result.BaseResult = response.IsSuccessStatusCode == false && response.StatusCode != HttpStatusCode.NotModified
                    ? serializer.Deserialize <BaseResult>(stream)
                    : new BaseResult();
            }

            if (throwForServerErrors.HasValue == false || throwForServerErrors.Value == true)
            {
                new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult);
            }

            return(result);
        }
示例#3
0
        // T can be any type
        // method should be used when base result is provided on server errors
        public async Task <ICommandResult <T> > RequestDistinctResult <T>(object data = null, Func <StreamWriter, Task> onStreamReady = null)
        {
            DistinctCommandResult <T> result = new DistinctCommandResult <T>();

            HttpResponseMessage response = null;

            if (onStreamReady == null)
            {
                response = await SendCommandAsync(data).ConfigureAwait(false);
            }
            else
            {
                response = await SendStreamCommandAsync(onStreamReady).ConfigureAwait(false);
            }

            var serializer = new DocumentSerializer(db);

            using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
            {
                if (EnableChangeTracking)
                {
                    JObject jObject = null;
                    result.Result = response.IsSuccessStatusCode ? serializer.DeserializeSingleResult <T>(stream, out jObject) : default(T);
                    if (response.IsSuccessStatusCode)
                    {
                        db.ChangeTracker.TrackChanges(result.Result, jObject);
                    }
                }
                else
                {
                    result.Result = response.IsSuccessStatusCode ? serializer.Deserialize <T>(stream) : default(T);
                }

                result.BaseResult = !response.IsSuccessStatusCode ? serializer.Deserialize <BaseResult>(stream) : new BaseResult {
                    Code = (int)response.StatusCode
                };
            }

            new BaseResultAnalyzer(db).ThrowIfNeeded(result.BaseResult);

            return(result);
        }
示例#4
0
        public async Task <List <ICommandResult <T> > > RequestMultipleMergedResult <T>(object data = null)
        {
            var results  = new List <ICommandResult <T> >();
            var response = await SendCommandAsync(data).ConfigureAwait(false);

            using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
            {
                var serializer = new DocumentSerializer(db);

                var _results = serializer.Deserialize <List <T> >(stream);
                foreach (var r in _results)
                {
                    var distinctResult = new DistinctCommandResult <T>
                    {
                        Result     = r,
                        BaseResult = r as BaseResult
                    };

                    results.Add(distinctResult);
                }
            }

            return(results);
        }