Код: Выделить всё
builder.Services.AddStackExchangeRedisCache(options => options.Configuration = redisConnectionString);
..
builder.Services.AddHybridCache(options => options.ReportTagMetrics = true);

В общем, чтобы использовать NodaTime, его нужно добавить в сериализатор.
Работает с MassTransit и RabbitMQ при следующей настройке:
Код: Выделить всё
x.UsingRabbitMq((context, cfg) =>
{
...
cfg.ConfigureJsonSerializerOptions(j => j.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb));
...
});
Я реализовал IHybridCacheSerializer и зарегистрировался в контейнере DI, но он никогда не вызывается. .AddSerializer — это просто оболочка .AddSingleton, поэтому он делает то же самое: ничего.
Основываясь на стандартной реализации AddHybridCache, у меня есть переопределил IHybridCacheSerializerFactory, чтобы попытаться разрешить определенные сериализаторы, но это не имеет значения, эта служба также никогда не разрешается.
Единственное обходное решение, которое я нашел, — это добавление сериализаторов NodaTime к преобразователю по умолчанию. список с использованием отражения. Но это огромный трюк: как глобально установить параметры по умолчанию для System.Text.Json.JsonSerializer?
[Обновление]
Основываясь на разъяснениях Марка Гравела, я переопределил стандартную фабрику IHybridCacheSerializerFactory, чтобы использовать собственный экземпляр JsonSerializerOptions. Это абсолютно приемлемое решение.
Подробнее здесь: https://stackoverflow.com/questions/790 ... with-redis
Мобильная версия