.NET Core 7 Razor Pages:Configure与UseRequestLocalization用法疑问
不需要同时使用builder.Services.Configure<RequestLocalizationOptions>和向UseRequestLocalization()传递参数这两种方式,二者选其一即可,核心作用都是配置请求本地化规则,只是适用场景略有区别:
通过DI容器配置(
builder.Services.Configure<RequestLocalizationOptions>)
这种方式是将配置存入依赖注入容器,好处是应用内其他组件(比如自定义中间件、页面模型、业务逻辑类)如果需要读取本地化配置(比如获取支持的文化列表),可以直接通过DI注入IOptions<RequestLocalizationOptions>来获取统一的配置。调用无参数的UseRequestLocalization()时,中间件会自动从DI容器中读取已配置的选项。直接向中间件传参(
UseRequestLocalization(yourOptions))
这种方式是直接给本地化中间件传入配置好的RequestLocalizationOptions实例,不需要经过DI容器。如果你的应用只有本地化中间件需要用到这些配置,没有其他地方要读取,这种方式更直接简洁。
注意:如果同时使用两种方式,直接传给
UseRequestLocalization()的参数会覆盖DI容器中的配置,因为中间件优先使用显式传入的实例。
推荐方案
如果应用后续可能有其他组件需要访问本地化配置,优先选择builder.Services.Configure<RequestLocalizationOptions>的方式,保持配置的集中管理和可复用性;如果只是单纯给本地化中间件做配置,两种方式都可以,选你觉得更顺手的就行。
代码优化提示
你当前代码中给RouteDataRequestCultureProvider赋值Options = options是多余的,中间件初始化时会自动将配置的RequestLocalizationOptions关联到对应的Provider,移除这一行不影响功能:
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { RouteDataStringKey = "culture", UIRouteDataStringKey = "culture" // 移除 Options = options 这一行 });
内容的提问来源于stack exchange,提问作者Miguel Moura

