Я создаю приложение ASP.NET Core 2 MVC и хочу использовать локализацию ресурсов на основе базы данных.Я создал минимальное приложение MVC, которое иллюстрирует мою проблему, источник можно найти здесь , и я буду ссылаться непосредственно на объекты, о которых я говорю ниже.
Я использую реализациювстроенного IStringLocalizer
, называемого StringResourceLocalizer
, который зависит от IResourceSource
, реализация которого ResourceSource
отвечает за взаимодействие с моей базой данных черезmy DataContext
.
При запуске приложения возникает проблема с временами жизни различных зависимостей, и я получаю следующую ошибку:
InvalidOperationException:Невозможно использовать выделенную службу LocalizationDemo.Data.DataContext из одноэлементного LocalizationDemo.Services.IResourceSource.
Я понимаю, почему я получаю эту ошибку, и это имеет смысл.Однако я не могу понять, как настроить время жизни моих зависимостей , чтобы заставить это работать.Я пробовал несколько подходов:
- Изменить
IResourceSource
на сферу: Не работает, потому что IStringLocalizerFactory
является одиночным - Изменить
IStringLocalizerFactory
и IStringLocalizer
для области видимости: приводит к следующему исключению InvalidOperationException: Не удается использовать службу области действия «Microsoft.Extensions.Localization.IStringLocalizerFactory» из одноэлементного «Microsoft.Extensions.Options.IOptions1 [Microsoft.AspNetCore.Mvc.MvcOptions] '.
- Заменено
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
и недостаточно гибок для моих нужд.