创建具有不同配置的相同依赖项的多个实例

时间:2019-01-12 00:30:22

标签: c# .net-core azure-functions autofac

我有一个应用程序( IJobInit ),该应用程序使用JSON设置中的列表来创建一个类( IJob )的多个实例。此类使用其他两个依赖项 IInputClient IOutputClient 来完成某些工作。它使用M.Extensions.DependencyInjection创建一个容器,该容器将移交给AutoFac来创建IContainer。

IJobInit(IContainer container)

我希望为每个IJob实例配置不同的IInputClient。具体来说,我想传递一个秘密供其使用。结果将是:

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 Function中并使用在配置中列出以创建内部作业。

谢谢!

1 个答案:

答案 0 :(得分:0)

我对这种解决方案并不完全满意,但它现在可以使用。

        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));
        }