You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SimpleInjector中注册多个AmazonS3Client并适配Adapter模式

问题原因

报错是因为你添加了多余的无效注册:

  1. 你已经手动构造好了所有S3Queryor实例、类型映射字典、S3FileNamesGetter实例,且已经作为单例注册到容器中,完全不需要容器帮你动态构造S3Queryor
  2. 多余的container.Register<IAmAnS3ClientQueryor, S3Queryor>()会让容器在验证时尝试构造S3Queryor,而你只有IAmazonS3的集合注册,没有单个IAmazonS3的默认注册,因此触发报错。
  3. 额外的container.Collection.Register<IAmazonS3>(client1, client2)对你当前的业务场景没有任何作用,属于无效注册。

解决方案

快速修复(适配当前场景)

直接删掉Bootstrap.Start方法里的两行无效注册即可:

// 删除这两行
container.Collection.Register<IAmazonS3>(client1, client2);
container.Register<IAmAnS3ClientQueryor, S3Queryor>();

同时你可以删掉container.Options.EnableAutoVerification = false配置,让容器正常做依赖校验,避免后续其他依赖问题被掩盖。修改后的完整注册代码如下:

internal class Bootstrap
{
    public static void Start(Container container, RegionEndpoint bucketRegion)
    {
        var client1 = new AmazonS3Client(apiKey1, secretKey1, bucketRegion);
        var client2 = new AmazonS3Client(apiKey2, secretKey2, bucketRegion);

        var s3ClientsQueryors = new Dictionary<S3ClientType, IAmAnS3ClientQueryor>
        {
            { S3ClientType.Discriminator1, new S3Queryor(client1) },
            { S3ClientType.Discriminator2, new S3Queryor(client2) }
        };

        container.RegisterInstance<IDictionary<S3ClientType, IAmAnS3ClientQueryor>>(s3ClientsQueryors);
        container.RegisterInstance<IGetFileNames>(new S3FileNamesGetter(s3ClientsQueryors));
        container.Verify();
    }
}

扩展方案(适合后续需要新增多S3客户端的场景)

如果你希望容器帮你管理S3Queryor的生命周期、自动注入其他依赖,不需要手动构造实例,可以通过注册委托的方式实现:

internal class Bootstrap
{
    public static void Start(Container container, RegionEndpoint bucketRegion)
    {
        // 注册构造S3Queryor的委托,传入指定的S3客户端
        Func<IAmazonS3, IAmAnS3ClientQueryor> queryorFactory = s3Client => new S3Queryor(s3Client);

        // 可从配置文件读取S3密钥配置,不需要硬编码
        var s3Configs = new List<(S3ClientType Type, string Ak, string Sk)>
        {
            (S3ClientType.Discriminator1, apiKey1, secretKey1),
            (S3ClientType.Discriminator2, apiKey2, secretKey2)
        };

        var s3ClientsQueryors = s3Configs.ToDictionary(
            k => k.Type, 
            v => queryorFactory(new AmazonS3Client(v.Ak, v.Sk, bucketRegion)));

        container.RegisterInstance(s3ClientsQueryors);
        container.Register<IGetFileNames>(() => new S3FileNamesGetter(s3ClientsQueryors));
        container.Verify();
    }
}

这种写法后续新增S3客户端时只需要在s3Configs里加配置即可,不需要修改其他注册逻辑。

内容的提问来源于stack exchange,提问作者DavidS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:36:01