Создать несколько экземпляров одной и той же зависимости с другой конфигурацией - PullRequest
0 голосов
/ 12 января 2019

У меня есть приложение ( IJobInit ), которое использует список из настроек JSON для создания нескольких экземпляров класса ( IJob ). Этот класс выполняет некоторую работу, используя две другие зависимости: IInputClient и IOutputClient . Он использует M.Extensions.DependencyInjection для создания контейнера, который передается в AutoFac для создания IContainer.

IJobInit(IContainer container)

Я бы хотел, чтобы IInputClient настраивался по-разному для каждого экземпляра IJob. В частности, я хотел бы передать секрет для использования. Результат будет:

IInputClient(HttpClient client)

где HttpClient настроен с использованием ConfigureHttpClient таким образом, что IJob не знает, что он предварительно аутентифицирован. Это также подойдет:

IInputClient(ISecretProvider secretsProvider, string secretName)

Конечный результат - три экземпляра IJob, в которых IInputClient настроен по-разному.

IJob(IInputClient inputClient1, IOutputClient outputClient)
IJob(IInputClient inputClient2, IOutputClient outputClient)
IJob(IInputClient inputClient3, IOutputClient outputClient)

Как мне этого добиться? Я смотрел на области Autofac, но они контролируют, когда экземпляр создается без какого-либо контроля над его конфигурацией (если я не пропустил его).

Коллега предложил мне разместить каждый экземпляр IJob в отдельном процессе с его собственной конфигурацией, которая возможна , но я пытаюсь разместить все задания в одной функции Azure и использовать список в конфигурации для создания внутренних заданий.

Спасибо!

1 Ответ

0 голосов
/ 15 января 2019

Я не совсем доволен этим решением, но пока оно работает.

        private async Task<IInputClient> GetClientAsync(string secretId)
        {
            HttpClient httpClient = this.httpClientFactory.CreateClient();

            string secret = await this.secretsProvider.GetSecretAsync(secretId);
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Concat(":", secret))));

            return this.scope.Resolve<IInputClient>(new TypedParameter(typeof(HttpClient), httpClient));
        }
...