/// <summary> /// /// </summary> /// <param name="mvcOptions"></param> /// <param name="contentResultExecutor"></param> /// <param name="controllerActionInvokerCache"></param> /// <param name="actionInvokerFactory"></param> /// <param name="actionInvokeInfoCache"></param> public RouteTesterActionInvokerFactory( IOptions <MvcOptions> mvcOptions, ContentResultExecutor contentResultExecutor, ControllerActionInvokerCache controllerActionInvokerCache, ActionInvokerFactory actionInvokerFactory, ActualActionInvokeInfoCache actionInvokeInfoCache) { _mvcOptions = mvcOptions; _contentResultExecutor = contentResultExecutor; _controllerActionInvokerCache = controllerActionInvokerCache; _actionInvokerFactory = actionInvokerFactory; _actionInvokeInfoCache = actionInvokeInfoCache; }
/// <summary> /// /// </summary> /// <param name="actionContext"></param> /// <param name="valueProviderFactories"></param> /// <param name="contentResultExecutor"></param> /// <param name="controllerActionInvokerCache"></param> /// <param name="actionInvokerFactory"></param> /// <param name="actionInvokeInfoCache"></param> public RouteTesterActionInvoker( ActionContext actionContext, IList <IValueProviderFactory> valueProviderFactories, ContentResultExecutor contentResultExecutor, ControllerActionInvokerCache controllerActionInvokerCache, ActionInvokerFactory actionInvokerFactory, ActualActionInvokeInfoCache actionInvokeInfoCache) { _actionContext = actionContext; _valueProviderFactories = valueProviderFactories; _contentResultExecutor = contentResultExecutor; _controllerActionInvokerCache = controllerActionInvokerCache; _actionInvokerFactory = actionInvokerFactory; _actionInvokeInfoCache = actionInvokeInfoCache; }
public static HttpHandler to_api_controller <TController>(string prefix = "", RouteValueDictionary defaultRouteValues = null) { return(HttpHandler.FromFunc(async ctx => { var currentPath = prefix + GetPath(ctx); // REVIEW: cache all this? var appModelProvider = ctx.RequestServices.GetServices <IApplicationModelProvider>().OfType <DefaultApplicationModelProvider>().Single(); ApplicationModelProviderContext appModelProviderCtx = new ApplicationModelProviderContext(new[] { typeof(TController).GetTypeInfo() }); appModelProvider.OnProvidersExecuting(appModelProviderCtx); var descriptors = ControllerActionDescriptorBuilder.Build(appModelProviderCtx.Result); var matchedDescriptors = new List <ActionDescriptor>(); var parsedValues = new Dictionary <ActionDescriptor, RouteValueDictionary>(); foreach (var d in descriptors) { var templateMatcher = new TemplateMatcher(TemplateParser.Parse(d.AttributeRouteInfo.Template), defaultRouteValues ?? new RouteValueDictionary()); var parsedRouteValues = new RouteValueDictionary(); if (templateMatcher.TryMatch(new PathString(currentPath), parsedRouteValues)) { matchedDescriptors.Add(d); parsedValues[d] = parsedRouteValues; } } var actionSelector = ctx.RequestServices.GetRequiredService <IActionSelector>(); var best = actionSelector.SelectBestCandidate(new RouteContext(ctx), matchedDescriptors); var routeCtx = new RouteContext(ctx); routeCtx.RouteData.Values.Clear(); foreach (var kv in parsedValues[best]) { routeCtx.RouteData.Values.Add(kv.Key, kv.Value); } var actx = new ActionContext(ctx, routeCtx.RouteData, best); var actionInvokerProvider = ctx.RequestServices.GetServices <IActionInvokerProvider>().OfType <ControllerActionInvokerProvider>().Single(); var fac = new ActionInvokerFactory(new[] { actionInvokerProvider }); IActionInvoker invoker = fac.CreateInvoker(actx); await invoker.InvokeAsync(); return true; })); }