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; }
/// <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; }
internal ODataRouteBuilderContext( ODataRouteMapping routeMapping, ApiVersion apiVersion, ControllerActionDescriptor actionDescriptor, #if API_EXPLORER ODataApiExplorerOptions options)