c# - 创建具有不同配置的相同依赖项的多个实例
问题描述
我有一个应用程序 ( 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 函数中托管所有作业并使用配置中的列表来创建内部作业。
谢谢!
解决方案
我对这个解决方案并不完全满意,但它现在有效。
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));
}
推荐阅读
- ruby-on-rails - 在rails应用程序中加载javascript的位置
- gcc - 对 2 个函数的未定义引用
- docker - 使用 docker 映像在 Rally 中创建赛道时出现 ConnectionError
- php - 致命错误:第 20 行 /home/xbt/Client/htdocs/common.php 中允许的内存大小为 262144000 字节已用尽(尝试分配 1879048224 字节)
- python - 如何让我的机器人在聊天中扭动欢迎消息?
- python - 使用 librosa 记录梅尔频谱图
- spring-boot - Spring-boot loginProcessingUrl 添加自定义标头
- c++ - std::stringstream 使用预分配的堆栈缓冲区进行写入
- python - 使用 Q-Learning 算法同时为多个对象寻找最短路径
- javascript - 内容脚本不与后台脚本通信 - chrome 扩展