Локализация и медиатор
От: BlackEric http://black-eric.lj.ru
Дата: 30.10.19 08:08
Оценка:
Проект с использованием медиатора.
Типичный метод в контролле выглядит как

[HttpPost("Register")]
[AllowAnonymous]
public async Task<UserRegisterResponse> Register([FromBody] BaseHandle<UserRegisterRequest, UserRegisterResponse> request, CancellationToken cancellationToken)
{
    return await _mediator.Send(request, cancellationToken);
}


Из хендлера и нижележащих слоев может возвращаться куча разнообзразных ошибок.
Как бы это нормально локализовать?
Пока не придумал ничего лучше чем возвращать из хендлера коды ошибок и из уже использовать как ключи для локализации.

Кто как делает?
https://github.com/BlackEric001
Re: Локализация и медиатор
От: RushDevion Россия  
Дата: 30.10.19 09:21
Оценка:
BE>Кто как делает?

1. Старый добрый Ambient Context.
System.Threading.Thread.CurrentCulture — как раз пример Ambient Context.
Только, чтобы это работало с async/await нужно будет вместо Thread Local Storage использовать AsyncLocal.
Т.е мы.
— Пишем обертку, e.g. Localizer.CurrentCulture, которая внутри использует AsyncLocal,
— Добавляем первым шагом пайплайна обработки запросов фильтр, который зачитает культуру (из кук, query-string, headers, свойств пользователя, etc) и установит ее Localizer.CurrentCulture = getCultureFromRequest(request)
— В сервисах, где нужно сделать локализацию просто берем культуру из Localizer.CurrentCulture

В целом рабочее решение, хотя апологеты чистого DI могут почуять codesmell из-за передачи неявной зависимости через статический класс. Поэтому:

2. Вместо статического класса Localizer, заводим сервис ILocalizer, который внутри делает все то же самое что в пункте 1, но инджектися через конструктор. DI-шники счатливы

3. Наследуем все реквесты/команды от базовых классов, у которых есть свойство Culture. И пишем ModelBinder/ActionInvoker, который будет анализировать параметры экшена и заполнять это поле.
Re: Локализация и медиатор
От: BlackEric http://black-eric.lj.ru
Дата: 20.11.19 06:44
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Кто как делает?


How to get resource strings in strongly typed way in asp.net core?

По ссылке во втором ответе описан вариант автоматической генерации локализационных ключей.
https://github.com/BlackEric001
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.