我正在构建一个ASP.NET Core 2 MVC应用程序,并希望使用数据库驱动的资源本地化。我已经创建了一个最小的MVC应用程序来说明我的问题,可以在here上找到源,并且我将直接链接到我在下面谈论的对象。
我正在使用称为StringResourceLocalizer
的内置IStringLocalizer
的实现,该实现依赖于IResourceSource
,其实现ResourceSource
负责通过我的{ {3}}。
启动应用程序时,各种依赖项的生存期存在问题,并且出现以下错误:
InvalidOperationException:无法使用单例“ LocalizationDemo.Services.IResourceSource”中的作用域服务“ LocalizationDemo.Data.DataContext”。
我理解为什么我会收到此错误,这很有意义。但是,我无法解决如何设置DataContext
使其正常工作的问题。我尝试了几种方法:
IResourceSource
更改为作用域:不起作用,因为IStringLocalizerFactory
是单例IStringLocalizerFactory
和IStringLocalizer
更改为范围:导致以下异常
InvalidOperationException:无法使用单例“ Microsoft.Extensions.Options.IOptions1 [Microsoft.AspNetCore.Mvc.MvcOptions]”中的作用域服务“ Microsoft.Extensions.Localization.IStringLocalizerFactory”。
DataContext
lifetime of my dependencies替换为dependency:使用服务定位器(反)模式尝试使单例ResourceSource
解析范围DataContext
实例,但它导致以下异常
InvalidOperationException:无法从根提供程序解析作用域服务'LocalizationDemo.Data.DataContext'。
我发现唯一可行的方法是将DataContextAccessor
更改为单例:
services.AddDbContext<DataContext>(o => o.UseInMemoryDatabase(), ServiceLifetime.Singleton, ServiceLifetime.Singleton);
但我99%的肯定,所有请求共享同一上下文是一个糟糕的主意。我考虑过使用第二个上下文来实现第一个上下文,该上下文仅由本地化系统使用,根据建议DataContext
可以是单例,但是ResourceSource
的实际实现将读为 写,所以我真的想避免单例!
我见过here软件包,它允许您使用Entity Framework进行本地化,但是它使用单例DbContext
并且不够灵活,无法满足我的需求。