Проект с использованием медиатора.
Типичный метод в контролле выглядит как
[HttpPost("Register")]
[AllowAnonymous]
public async Task<UserRegisterResponse> Register([FromBody] BaseHandle<UserRegisterRequest, UserRegisterResponse> request, CancellationToken cancellationToken)
{
return await _mediator.Send(request, cancellationToken);
}
Из хендлера и нижележащих слоев может возвращаться куча разнообзразных ошибок.
Как бы это нормально локализовать?
Пока не придумал ничего лучше чем возвращать из хендлера коды ошибок и из уже использовать как ключи для локализации.
Кто как делает?
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, который будет анализировать параметры экшена и заполнять это поле.
Здравствуйте, BlackEric, Вы писали:
BE>Кто как делает?
How to get resource strings in strongly typed way in asp.net core?
По ссылке во втором ответе описан вариант автоматической генерации локализационных ключей.