.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
相关产品推荐
相关产品推荐

