我有一个应用程序( 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中并使用在配置中列出以创建内部作业。
谢谢!
答案 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));
}