예제 #1
0
        public RequestVersionProvider(IEnumerable <IRequestVersionParser> versionParsers,
                                      IOptions <ApiActionConfiguration> configurationAccessor, IVersionEdgeProvider versionEdgeProvider,
                                      IApiActionRegistrationProvider apiActionRegistrationProvider)
        {
            if (versionParsers == null)
            {
                throw new ArgumentNullException(nameof(versionParsers));
            }
            if (configurationAccessor == null)
            {
                throw new ArgumentNullException(nameof(configurationAccessor));
            }
            if (versionEdgeProvider == null)
            {
                throw new ArgumentNullException(nameof(versionEdgeProvider));
            }
            if (apiActionRegistrationProvider == null)
            {
                throw new ArgumentNullException(nameof(apiActionRegistrationProvider));
            }

            _versionParsers = versionParsers.ToArray();
            if (!ApiActionVersion.TryParse(configurationAccessor.Value.DefaultRequestVersion, out _defaultVersion))
            {
                _defaultVersion = versionEdgeProvider
                                  .GetVersionEdges(apiActionRegistrationProvider.Registrations
                                                   .Select(r => r.ApiActionType).ToList()).OrderByDescending(v => v)
                                  .FirstOrDefault()
                                  ?? new ApiActionVersion(1, 0);
            }
        }
        public void InEqualComparisons(string smaller, string larger)
        {
            Assert.IsTrue(ApiActionVersion.TryParse(smaller, out var smallerVersion));
            Assert.IsTrue(ApiActionVersion.TryParse(larger, out var largerVersion));

            Assert.IsFalse(smallerVersion == largerVersion);
            Assert.IsFalse(smallerVersion.Equals(largerVersion));
            Assert.IsTrue(smallerVersion != largerVersion);
            Assert.AreNotEqual(smallerVersion.GetHashCode(), largerVersion.GetHashCode());

            Assert.IsTrue(smallerVersion < largerVersion);
            Assert.IsTrue(smallerVersion <= largerVersion);
            Assert.IsTrue(smallerVersion.CompareTo(largerVersion) < 0);

            Assert.IsTrue(largerVersion > smallerVersion);
            Assert.IsTrue(largerVersion >= smallerVersion);
            Assert.IsTrue(largerVersion.CompareTo(smallerVersion) > 0);

            Assert.AreNotEqual(largerVersion.ToString(), smallerVersion.ToString());
        }
예제 #3
0
        public ApiActionVersion Get(HttpContext context, IDictionary <string, object> routeValues)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            if (routeValues == null)
            {
                throw new ArgumentNullException(nameof(routeValues));
            }

            context.Items.TryGetValue(RequestCacheKey, out var requestCachedVersion);

            var version = requestCachedVersion as ApiActionVersion;

            if (version == null)
            {
                foreach (var versionParser in _versionParsers)
                {
                    var versionString = versionParser.Parse(context, routeValues);

                    if (versionString != null && ApiActionVersion.TryParse(versionString, out version))
                    {
                        break;
                    }
                }

                if (version == null)
                {
                    // If version not found, use configuration provided value, then default
                    version = _defaultVersion;
                }

                context.Items[RequestCacheKey] = version;
            }

            return(version);
        }
 public void TryParseInvalidVersion(string value)
 {
     Assert.IsFalse(ApiActionVersion.TryParse(value, out var output));
     Assert.IsNull(output);
 }