如何在IStringLocalizer实现中使用DbContext?

时间:2018-10-04 11:19:47

标签: c# dependency-injection asp.net-core-mvc asp.net-core-2.0 asp.net-core-2.1

我正在构建一个ASP.NET Core 2 MVC应用程序,并希望使用数据库驱动的资源本地化。我已经创建了一个最小的MVC应用程序来说明我的问题,可以在here上找到源,并且我将直接链接到我在下面谈论的对象。

我正在使用称为StringResourceLocalizer的内置IStringLocalizer的实现,该实现依赖于IResourceSource,其实现ResourceSource负责通过我的{ {3}}。

启动应用程序时,各种依赖项的生存期存在问题,并且出现以下错误:

  

InvalidOperationException:无法使用单例“ LocalizationDemo.Services.IResourceSource”中的作用域服务“ LocalizationDemo.Data.DataContext”。

我理解为什么我会收到此错误,这很有意义。但是,我无法解决如何设置DataContext使其正常工作的问题。我尝试了几种方法:

  1. IResourceSource更改为作用域:不起作用,因为IStringLocalizerFactory是单例
  2. IStringLocalizerFactoryIStringLocalizer更改为范围:导致以下异常
      

    InvalidOperationException:无法使用单例“ Microsoft.Extensions.Options.IOptions1 [Microsoft.AspNetCore.Mvc.MvcOptions]”中的作用域服务“ Microsoft.Extensions.Localization.IStringLocalizerFactory”。

  3. 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并且不够灵活,无法满足我的需求。

0 个答案:

没有答案