代码之家  ›  专栏  ›  技术社区  ›  Richard Fuller

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

  •  0
  • Richard Fuller  · 技术社区  · 6 年前

    我有个申请( 伊乔宁 )使用json设置中的列表创建类的多个实例( 我的工作 )这个类使用另外两个依赖项做一些工作, Iclipse客户端 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函数中托管所有作业,并使用config中的列表创建内部作业。

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Richard Fuller    6 年前

    我对这个解决方案并不完全满意,但目前它是有效的。

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