Перенос объектов между областями поставщика услуг - PullRequest
0 голосов
/ 22 мая 2019

У меня есть CorrelationIdMiddleware, который проверяет заголовки входящих запросов и устанавливает область действия CorrelationId, которая затем распространяется на все HttpClients.

public class CorrelationId {
    public string Value { get;set; }
}

public void ConfigureServices(IServiceCollection services) {
    ...
    services.AddScoped<CorrelationId>();
    ...
}

Я столкнулся с вариантом использования, где мне нужносоздать изолированную область вокруг части кода, но хотелось бы, чтобы CorrelationId из области действия http-запроса распространялся в изолированную область (в изолированной области есть HttpClient, к которому я хотел бы присоединить тот же заголовок).

Я хотел бы создать фоновую задачу, созданную из DI с любыми необходимыми зависимостями и для любых HttpClients, для которых заголовки вводятся через плагины HttpClientFactory.

public Controller {

    public Controller(IServiceProvider serviceProvider, CorrelationId correlationId) { ... }

    public IActionResult PostTask() {
        var isolatedScope = _serviceProvider.CreateScope();

        var action = () => {
            using(isolatedScope) {
                var backgroundJob = isolatedScope
                    .ServiceProvider
                    .GetRequiredService<IBackgroundJob>();
                backgroundJob.Execute();

                // scopedCorrelationId  =/= correlationId
                // how can i get correlationId to jump scopes?
            }
        };

        return Task.Factory.StartNew(
            action,
            CancellationToken.None,
            TaskCreationOptions.LongRunning,
            TaskScheduler.Default);
    }
}

Есть лиспособ передачи определенных объектов в изолированную область?В идеале без знания typeof(object) мне нужно перевести.

1 Ответ

0 голосов
/ 31 мая 2019

Невозможно перенести объекты между родительской областью и изолированной областью.

Информация, такая как CorrelationId, поступающая с заголовками запроса, лучше соответствует HttpContext или переменной AsyncLocal, если ее необходимо распространить через поток асинхронного выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...