我正在挖掘源代码,看看asp.net核心发现如何自定义IRouteConstraint
。
我们知道,当我们定义自定义IRouteConstraint
时,我们会将其作为添加到RouteOptions
中
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RouteOptions>(opts => {
opts.ConstraintMap.Add("countryName", typeof(CountryRouteConstraint));
});
}
public class CountryRouteConstraint: IRouteConstraint
{
public bool Match(...) { ... }
}
其中CCD_ 4被注册。
所以我检查了的源代码
EndpointRoutingMiddleware
(https://source.dot.net/#Microsoft.AspNetCore.Routing/EndpointRoutingMiddleware.cs,e91e5febd7b6da29(DfaMatcher
(https://source.dot.net/#Microsoft.AspNetCore.Routing/Matching/DfaMatcher.cs,0b08e610bec2cfbc(
等等,我没有找到任何试图从RouteOptions
读取到发现自定义IRouteConstraint
的源代码部分。
这是我认为最有可能的地方https://source.dot.net/#Microsoft.AspNetCore.Routing/Matching/DfaMatcher.cs,197但是仍然没有找到任何东西。
有人能给我看一下ASP.NET Core从RouteOptions
读取到发现自定义IRouteConstraint
的源代码部分吗?
导航到RouteOptions
的ConstraintMap
属性,您将向该属性添加CountryRouteConstraint
约束。
查找其参考资料。
你最感兴趣的是
-
DefaultInlineConstraintResolver
-
DefaultParameterPolicyFactory
两者都使用ParameterPolicyActivator
来实例化约束,并传入该ConstraintMap
。
例如,DefaultParameterPolicyFactory显示在下方
var parameterPolicy = ParameterPolicyActivator.ResolveParameterPolicy<IParameterPolicy>(
_options.ConstraintMap,
_serviceProvider,
inlineText,
out var parameterPolicyKey);