コード例 #1
0
 public RouteReflector(IRouteReflectorOptions options)
 {
     _options = options;
 }
コード例 #2
0
        private static string ReplaceRoutePlaceholders(string routeTemplate, Type controller, MethodInfo action, IRouteReflectorOptions options)
        {
            var partRegexSquare = new Regex(@"\[(?<part>[^]=?]+)[?]?(=[^]]+)?\]");
            var partRegexBraces = new Regex(@"\{(?<part>[^}=?]+)[?]?(=[^}]+)?\}");

            string ExtractParameterName(string part) =>
                !part.Contains(':') ? part : part.Substring(0, part.IndexOf(':'));

            bool DoesRouteParamExist(string paramName)
            {
                if (action.GetParameters()
                    .Any(p => p.Name?.Equals(paramName, StringComparison.InvariantCultureIgnoreCase) ?? false))
                    return true;
                if (action.GetParameters()
                    .Where(p => !options.TypeConverter.TreatAsPrimitive(p.ParameterType.UnwrapNullable())
                                && !p.ParameterType.IsCollection()
                                && p.GetCustomAttributes(StaticConfig.Instance.FromRouteAttribute).Any())
                    .Any(p => p.ParameterType.GetProperties().Any(prop =>
                        prop.Name.Equals(paramName, StringComparison.InvariantCultureIgnoreCase))))
                    return true;
                return false;
            }

            string MatchReplacer(Match match) => match.Groups["part"].Value switch
            {
                "controller" => controller.Name.Replace("Controller", "").ToLower(),
                "action" => action.Name.ToLower(),
                _ => DoesRouteParamExist(ExtractParameterName(match.Groups["part"].Value))
                    ? $"{{{ExtractParameterName(match.Groups["part"].Value)}}}"
                    : ""
            };


            return partRegexSquare.Replace(
                partRegexBraces.Replace(routeTemplate, MatchReplacer),
                MatchReplacer);
        }
コード例 #3
0
        internal static string DefaultBuildRouteStrategy(Type controller, MethodInfo action, string defaultRoute, IRouteReflectorOptions options)
        {
            var controllerRouteTemplate = controller.GetCustomAttributes(StaticConfig.Instance.RouteAttribute)
                .Select(StaticConfig.Instance.GetTemplateFromRouteAttribute)
                .FirstOrDefault();
            var methodRouteTemplate = action.GetCustomAttributes(StaticConfig.Instance.RouteAttribute)
                .Select(StaticConfig.Instance.GetTemplateFromRouteAttribute)
                .FirstOrDefault();
            var httpMethodTemplate = action.GetCustomAttributes()
                .Where(a => StaticConfig.Instance.HttpMethodBaseAttribute.IsInstanceOfType(a))
                .Select(StaticConfig.Instance.GetTemplateFromHttpMethodAttribute)
                .FirstOrDefault();

            var parts = new List<string>();

            if (methodRouteTemplate?.StartsWith("/") != true && controllerRouteTemplate != null)
                parts.Add(controllerRouteTemplate);

            if (methodRouteTemplate != null)
                parts.Add(methodRouteTemplate);
            if (httpMethodTemplate != null)
            {
                if (httpMethodTemplate.StartsWith("/"))
                    parts = new List<string> {httpMethodTemplate};
                else
                    parts.Add(httpMethodTemplate);
            }

            var routeTemplate = parts.Any() ? string.Join("/", parts) : defaultRoute;


            return ReplaceRoutePlaceholders(routeTemplate, controller, action, options)
                .Trim('/');
        }