internal ODataRouteBuilderContext(
            ODataRouteMapping routeMapping,
            ControllerActionDescriptor actionDescriptor,
            ODataApiExplorerOptions options)
        {
            ApiVersion            = routeMapping.ApiVersion;
            Services              = routeMapping.Services;
            EdmModel              = Services.GetRequiredService <IEdmModel>();
            routeAttribute        = actionDescriptor.MethodInfo.GetCustomAttributes <ODataRouteAttribute>().FirstOrDefault();
            RouteTemplate         = routeAttribute?.PathTemplate;
            Route                 = routeMapping.Route;
            ActionDescriptor      = actionDescriptor;
            ParameterDescriptions = new List <ApiParameterDescription>();
            Options               = options;
            UrlKeyDelimiter       = UrlKeyDelimiterOrDefault(Services.GetRequiredService <ODataOptions>().UrlKeyDelimiter);

            var container = EdmModel.EntityContainer;

            if (container == null)
            {
                IsRouteExcluded = true;
                return;
            }

            var controllerName = actionDescriptor.ControllerName;
            var actionName     = actionDescriptor.ActionName;

            EntitySet = container.FindEntitySet(controllerName);
            Operation = container.FindOperationImports(controllerName).FirstOrDefault()?.Operation ??
                        EdmModel.FindDeclaredOperations(string.Concat(container.Namespace, ".", actionName)).FirstOrDefault();
            ActionType = GetActionType(EntitySet, Operation);
        }
        internal ODataRouteBuilderContext(
            ODataRouteMapping routeMapping,
            ApiVersion apiVersion,
            ControllerActionDescriptor actionDescriptor,
            ODataApiExplorerOptions options)
        {
            ApiVersion            = apiVersion;
            Services              = routeMapping.Services;
            routeAttribute        = actionDescriptor.MethodInfo.GetCustomAttributes <ODataRouteAttribute>().FirstOrDefault();
            RouteTemplate         = routeAttribute?.PathTemplate;
            RoutePrefix           = routeMapping.RoutePrefix;
            ActionDescriptor      = actionDescriptor;
            ParameterDescriptions = new List <ApiParameterDescription>();
            Options         = options;
            UrlKeyDelimiter = UrlKeyDelimiterOrDefault(Services.GetRequiredService <ODataOptions>().UrlKeyDelimiter);

            var selector  = Services.GetRequiredService <IEdmModelSelector>();
            var model     = selector.SelectModel(apiVersion);
            var container = model?.EntityContainer;

            if (model == null || container == null)
            {
                EdmModel        = Services.GetRequiredService <IEdmModel>();
                IsRouteExcluded = true;
                return;
            }

            EdmModel        = model;
            Services        = new FixedEdmModelServiceProviderDecorator(Services, model);
            EntitySet       = container.FindEntitySet(actionDescriptor.ControllerName);
            Singleton       = container.FindSingleton(actionDescriptor.ControllerName);
            Operation       = ResolveOperation(container, actionDescriptor.ActionName);
            ActionType      = GetActionType(actionDescriptor);
            IsRouteExcluded = ActionType == ODataRouteActionType.Unknown;
        }
Пример #3
0
        /// <summary>
        /// Adds or replaces the configured <see cref="IApiExplorer">API explorer</see> with an implementation that supports OData and API versioning.
        /// </summary>
        /// <param name="configuration">The <see cref="HttpConfiguration">configuration</see> used to add the API explorer.</param>
        /// <param name="setupAction">An <see cref="Action{T}">action</see> used to configure the provided options.</param>
        /// <returns>The newly registered <see cref="ODataApiExplorer">versioned API explorer</see>.</returns>
        /// <remarks>This method always replaces the <see cref="IApiExplorer"/> with a new instance of <see cref="ODataApiExplorer"/>.</remarks>
        public static ODataApiExplorer AddODataApiExplorer(this HttpConfiguration configuration, Action <ODataApiExplorerOptions> setupAction)
        {
            Arg.NotNull(configuration, nameof(configuration));
            Arg.NotNull(setupAction, nameof(setupAction));
            Contract.Ensures(Contract.Result <ODataApiExplorer>() != null);

            var options = new ODataApiExplorerOptions(configuration);

            setupAction(options);

            var apiExplorer = new ODataApiExplorer(configuration, options);

            configuration.Services.Replace(typeof(IApiExplorer), apiExplorer);
            return(apiExplorer);
        }
        internal ODataRouteBuilderContext(
            HttpConfiguration configuration,
            ApiVersion apiVersion,
            ODataRoute route,
            HttpActionDescriptor actionDescriptor,
            IList <ApiParameterDescription> parameterDescriptions,
            ModelTypeBuilder modelTypeBuilder,
            ODataApiExplorerOptions options)
        {
            Contract.Requires(configuration != null);
            Contract.Requires(apiVersion != null);
            Contract.Requires(route != null);
            Contract.Requires(actionDescriptor != null);
            Contract.Requires(parameterDescriptions != null);
            Contract.Requires(modelTypeBuilder != null);
            Contract.Requires(options != null);

            ApiVersion            = apiVersion;
            serviceProvider       = configuration.GetODataRootContainer(route);
            EdmModel              = serviceProvider.GetRequiredService <IEdmModel>();
            Assemblies            = configuration.Services.GetAssembliesResolver().GetAssemblies();
            routeAttribute        = actionDescriptor.GetCustomAttributes <ODataRouteAttribute>().FirstOrDefault();
            RouteTemplate         = routeAttribute?.PathTemplate;
            Route                 = route;
            ActionDescriptor      = actionDescriptor;
            ParameterDescriptions = parameterDescriptions;
            Options               = options;
            UrlKeyDelimiter       = configuration.GetUrlKeyDelimiter() ?? Parentheses;

            var container = EdmModel.EntityContainer;

            if (container == null)
            {
                IsRouteExcluded = true;
                return;
            }

            EntitySet = container.FindEntitySet(actionDescriptor.ControllerDescriptor.ControllerName);
            Operation = container.FindOperationImports(actionDescriptor.ActionName).FirstOrDefault()?.Operation ??
                        EdmModel.FindDeclaredOperations(container.Namespace + "." + actionDescriptor.ActionName).FirstOrDefault();
            ActionType = GetActionType(EntitySet, Operation);

            if (Operation?.IsAction() == true)
            {
                ConvertODataActionParametersToTypedModel(modelTypeBuilder, (IEdmAction)Operation);
            }
        }
        internal ODataRouteBuilderContext(
            HttpConfiguration configuration,
            ApiVersion apiVersion,
            ODataRoute route,
            HttpActionDescriptor actionDescriptor,
            IList <ApiParameterDescription> parameterDescriptions,
            IModelTypeBuilder modelTypeBuilder,
            ODataApiExplorerOptions options)
        {
            this.route            = route;
            ApiVersion            = apiVersion;
            Services              = configuration.GetODataRootContainer(route);
            routeAttribute        = actionDescriptor.GetCustomAttributes <ODataRouteAttribute>().FirstOrDefault();
            RouteTemplate         = routeAttribute?.PathTemplate;
            RoutePrefix           = route.RoutePrefix?.Trim('/');
            ActionDescriptor      = actionDescriptor;
            ParameterDescriptions = parameterDescriptions;
            Options         = options;
            UrlKeyDelimiter = UrlKeyDelimiterOrDefault(configuration.GetUrlKeyDelimiter() ?? Services.GetService <IODataPathHandler>()?.UrlKeyDelimiter);

            var selector  = Services.GetRequiredService <IEdmModelSelector>();
            var model     = selector.SelectModel(apiVersion);
            var container = model?.EntityContainer;

            if (model == null || container == null)
            {
                EdmModel        = Services.GetRequiredService <IEdmModel>();
                IsRouteExcluded = true;
                return;
            }

            var controllerName = actionDescriptor.ControllerDescriptor.ControllerName;

            EdmModel        = model;
            Services        = new FixedEdmModelServiceProviderDecorator(Services, model);
            EntitySet       = container.FindEntitySet(controllerName);
            Singleton       = container.FindSingleton(controllerName);
            Operation       = ResolveOperation(container, actionDescriptor.ActionName);
            ActionType      = GetActionType(actionDescriptor);
            IsRouteExcluded = ActionType == ODataRouteActionType.Unknown;

            if (Operation?.IsAction() == true)
            {
                ConvertODataActionParametersToTypedModel(modelTypeBuilder, (IEdmAction)Operation, controllerName);
            }
        }
 public void Configure(ODataApiExplorerOptions options)
 {
     options.GroupNameFormat           = "'v'VVV";
     options.SubstituteApiVersionInUrl = true;
 }
Пример #7
0
        internal ODataRouteBuilderContext(
            ODataRouteMapping routeMapping,
            ApiVersion apiVersion,
            ControllerActionDescriptor actionDescriptor,
#if API_EXPLORER
            ODataApiExplorerOptions options)