You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clean架构下.NET6如何在Application项目中注入IStringLocalizer?

在.NET 6 Clean架构中解决跨层本地化问题

核心问题拆解

你遇到的本质问题是Clean架构的层间引用限制导致无法共享API层的本地化资源,同时资源文件的存放位置不符合分层职责。下面是具体的解决方案:


步骤1:在Application层创建本地化锚点类

在Application项目中新增一个空类,作为本地化服务的关联标记(不需要任何业务代码),避免依赖API层的控制器:

namespace YourAppNamespace.Application;
public class AppLocalizationMarker
{
    // 空类,仅作为本地化资源的锚点
}

步骤2:迁移/重构资源文件

方案A:统一迁移到Application层

将API层的MyController.fr-BE.resx、MyController.nl-BE.resx重命名为AppLocalizationMarker.fr-BE.resx、AppLocalizationMarker.nl-BE.resx,并移动到Application项目的Resources文件夹(没有则新建)。

注意:右键资源文件 → 属性,设置生成操作为Embedded resource,自定义工具为ResXFileCodeGenerator(.NET 6+通常会自动处理,但建议确认)。

方案B:分层管理资源

如果需要保留API控制器专属资源,可拆分资源:

  • API层保留MyController.*.resx,仅用于控制器的本地化
  • Application层新增AppLocalizationMarker.*.resx,存放服务层需要的本地化文本(比如把Article条目移到这里)

步骤3:在API层配置本地化服务

修改Program.cs(或Startup.cs)的本地化配置,指定使用Application层的锚点类:

// 添加本地化服务,指定资源文件路径(对应Application项目的Resources文件夹)
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");

// 配置请求本地化规则
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
    var supportedCultures = new[]
    {
        new CultureInfo("fr-BE"),
        new CultureInfo("nl-BE")
    };

    options.DefaultRequestCulture = new RequestCulture("fr-BE");
    options.SupportedCultures = supportedCultures;
    options.SupportedUICultures = supportedCultures;

    // 启用常用的文化提供器(URL参数、Cookie)
    options.RequestCultureProviders = new List<IRequestCultureProvider>
    {
        new QueryStringRequestCultureProvider(),
        new CookieRequestCultureProvider()
    };
});

// 注册针对Application层的本地化器
builder.Services.AddScoped<IStringLocalizer>(sp =>
    sp.GetRequiredService<IStringLocalizer<AppLocalizationMarker>>());

步骤4:在Application层的服务中使用本地化

现在可以在MyService中直接注入IStringLocalizer<AppLocalizationMarker>(或IStringLocalizer):

namespace YourAppNamespace.Application.Services;
public class MyService
{
    private readonly IStringLocalizer<AppLocalizationMarker> _localizer;

    public MyService(IStringLocalizer<AppLocalizationMarker> localizer)
    {
        _localizer = localizer;
    }

    public string GetLocalizedArticle()
    {
        return _localizer["Article"]; // 自动读取对应文化的文本
    }
}

关键注意事项

  • 避免循环引用:通过Application层的锚点类,彻底切断API层与Application层的反向依赖
  • 资源文件访问:API项目因引用了Application项目,能自动读取其嵌入的资源文件,无需额外配置程序集扫描
  • 文化一致性:CurrentThread.CurrentCulture会自动继承请求的文化设置,服务层无需额外处理

内容的提问来源于stack exchange,提问作者TheBoubou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:15:43