首页 > 解决方案 > 创建具有不同配置的相同依赖项的多个实例

问题描述

我有一个应用程序 ( IJobInit ),它使用 JSON 设置中的列表来创建一个类 ( IJob ) 的多个实例。此类使用其他两个依赖项 IInputClientIOutputClient来完成一些工作。它使用 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 函数中托管所有作业并使用配置中的列表来创建内部作业。

谢谢!

标签: c#.net-coreazure-functionsautofac

解决方案


我对这个解决方案并不完全满意,但它现在有效。

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

推荐阅读