Как вы используете ваш DbContext в реализации IStringLocalizer? - PullRequest
0 голосов
/ 04 октября 2018

Я создаю приложение ASP.NET Core 2 MVC и хочу использовать локализацию ресурсов на основе базы данных.Я создал минимальное приложение MVC, которое иллюстрирует мою проблему, источник можно найти здесь , и я буду ссылаться непосредственно на объекты, о которых я говорю ниже.

Я использую реализациювстроенного IStringLocalizer, называемого StringResourceLocalizer, который зависит от IResourceSource, реализация которого ResourceSource отвечает за взаимодействие с моей базой данных черезmy DataContext.

При запуске приложения возникает проблема с временами жизни различных зависимостей, и я получаю следующую ошибку:

InvalidOperationException:Невозможно использовать выделенную службу LocalizationDemo.Data.DataContext из одноэлементного LocalizationDemo.Services.IResourceSource.

Я понимаю, почему я получаю эту ошибку, и это имеет смысл.Однако я не могу понять, как настроить время жизни моих зависимостей , чтобы заставить это работать.Я пробовал несколько подходов:

  1. Изменить IResourceSource на сферу: Не работает, потому что IStringLocalizerFactory является одиночным
  2. ИзменитьIStringLocalizerFactory и IStringLocalizer для области видимости: приводит к следующему исключению

    InvalidOperationException: Не удается использовать службу области действия «Microsoft.Extensions.Localization.IStringLocalizerFactory» из одноэлементного «Microsoft.Extensions.Options.IOptions1 [Microsoft.AspNetCore.Mvc.MvcOptions] '.

  3. Заменено DataContext Зависимость на DataContextAccessor: Попытка с помощью шаблона поиска службы (анти) разрешить одноэлементному ResourceSource разрешить экземпляр DataContext с областью действия, но это приводит к следующему исключению

    InvalidOperationException: Не удается разрешить службу с ограничением объема 'LocalizationDemo.Data.DataContext'от корневого провайдера.

Единственный найденный мной подход, который "работает", заключается в замене моего DataContext на singleton:

services.AddDbContext<DataContext>(o => o.UseInMemoryDatabase(), ServiceLifetime.Singleton, ServiceLifetime.Singleton);

Но я уверен на 99%Если все запросы разделяют один и тот же контекст, это ужасная идея.Я думал об использовании второго контекста, который реализует первый, который используется только системой локализации, который затем может быть одноэлементным в соответствии с предложением здесь , но реальная реализация ResourceSource будет читать и запись из базы данных, поэтому я действительно хочу избежать синглтона!

Я видел этот пакет, который позволяет вам использовать Entity Framework для локализации,но он использует синглтон DbContext и недостаточно гибок для моих нужд.

...