Замените MvcNewtonsoftJsonOptions для каждого полученного запроса - PullRequest
2 голосов
/ 08 апреля 2020

Есть ли способ заменить MvcNewtonsoftJsonOptions для каждого запроса?

Как зарегистрировать MvcNewtonsoftJsonOptions:

private static void AddJsonFormatterServices(IServiceCollection services) {
   services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<MvcNewtonsoftJsonOptions>, OurMvcJsonOptions>());            
}
// This needs to replaced somehow for every request.

В OurMvcJsonOptions Я регистрирую JSonConverters. Эта служба читает все json преобразователи и добавляет их в параметры преобразователей JSONSerializer.

Проблема: Проблема заключается в том, что один из преобразователей использует интерфейс, разрешенный из DI на запрос и так как теперь это глобальная область действия, он разрешит компонент из глобальной области. Теперь, когда запрос получен, он все еще использует компонент из глобального контекста, который не содержит требуемой информации.

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

Существует также аналогичный вопрос здесь но это не решило мою проблему, так как форматеры в последней версии были удалены.

Чтобы подвести итог проблемы, MVC регистрирует MvcNewtonsoftJsonOptions как одиночный, в то время как мне нужно, чтобы он создавался для каждого запроса, чтобы у меня был правильный JsonConverter для значений в запросе.

1 Ответ

1 голос
/ 13 апреля 2020

Если у вас есть тип, который решается с помощью Dependency Injection, но у вас есть ресурс, для которого требуется другая конфигурация или другая область действия регистрации DI. Самый простой способ - сделать вторую регистрацию в DI с другой реализацией и / или областью действия.

Так что, если у вас уже есть:

private static void AddJsonFormatterServices(IServiceCollection services) {
   services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<MvcNewtonsoftJsonOptions>, OurMvcJsonOptions>());            
}

Вы можете добавить специальную:

    private static void AddJsonFormatterServices(IServiceCollection services) {

 services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<MvcNewtonsoftJsonOptions>, OurMvcJsonOptions>());            

    services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<OurSpecializedMvcJsonOptions>, OurSpecializedMvcJsonOptions>());            
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...