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

.NET Core中IStringLocalizer依赖注入报错问题求助

解决EF Core实体构造函数无法绑定IStringLocalizer的问题

看起来你遇到的问题核心是EF Core无法解析实体类AcademiejaarInst构造函数中的IStringLocalizer参数——EF在实例化实体时,只会尝试绑定对应实体属性的参数,而localizer并不是实体的属性,所以找不到合适的构造函数。

问题根源

你的AcademiejaarInst作为EF Core的实体类,构造函数依赖了IStringLocalizer<SharedResource>,但EF Core在创建实体实例时,并不会从依赖注入容器中获取服务(比如本地化器),它只能识别与实体属性匹配的构造函数参数,或者无参构造函数。

解决方案

1. 给实体类添加无参构造函数(快速修复)

EF Core可以访问私有构造函数,你可以添加一个私有的无参构造函数,让EF能够正常实例化实体,同时保留带本地化器的构造函数供业务代码使用:

public class AcademiejaarInst {
    private static IStringLocalizer<SharedResource> _localizer;
    
    // 供EF Core使用的无参构造函数
    private AcademiejaarInst() {}

    // 供业务代码使用的构造函数
    public AcademiejaarInst(IStringLocalizer<SharedResource> localizer) {
        _localizer = localizer;
    }
    // 其他属性和方法...
}

2. 调整实体类的本地化逻辑(更推荐的架构实践)

领域实体类应该保持纯净,不依赖依赖注入的服务(比如IStringLocalizer)。更好的做法是把本地化逻辑移到服务层或者UI层:

  • 如果是在实体的方法中需要本地化文本,不要在实体内部持有_localizer,而是在调用方法时传入本地化器:
public class AcademiejaarInst {
    // 移除静态_localizer和带参数的构造函数
    public AcademiejaarInst() {}

    // 示例:需要本地化的方法,传入localizer
    public string GetLocalizedName(IStringLocalizer<SharedResource> localizer) {
        return localizer["AcademiejaarInst.Name"];
    }
}

3. 清理Startup中的冗余配置

你在Startup中添加的services.AddTransient<AcademiejaarInst>()其实没必要,因为EF Core会自己管理实体的实例化。另外,本地化的配置顺序建议调整为更合理的流程:

public void ConfigureServices(IServiceCollection services) {
    // 先添加本地化基础服务
    services.AddLocalization(o => o.ResourcesPath = "Resources");
    
    services.AddMvc(config => ... )
        .AddViewLocalization(o => o.ResourcesPath = "Resources")
        .AddDataAnnotationsLocalization(options => {
            options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource));
        });

    services.Configure<RequestLocalizationOptions>(options => {
        var supportedCultures = new[] { new CultureInfo("nl-BE") };
        options.DefaultRequestCulture = new RequestCulture("nl-BE", "nl_BE");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
    });
    
    // 移除services.AddTransient<AcademiejaarInst>()和services.AddSingleton<IStringLocalizer...>
    // 因为AddLocalization已经注册了必要的本地化服务
    ...
}

这样调整后,EF Core就能正常实例化你的实体类,同时本地化功能也能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:31:26