如何在SimpleInjector中注册多个AmazonS3Client并适配Adapter模式
问题原因
报错是因为你添加了多余的无效注册:
- 你已经手动构造好了所有
S3Queryor实例、类型映射字典、S3FileNamesGetter实例,且已经作为单例注册到容器中,完全不需要容器帮你动态构造S3Queryor - 多余的
container.Register<IAmAnS3ClientQueryor, S3Queryor>()会让容器在验证时尝试构造S3Queryor,而你只有IAmazonS3的集合注册,没有单个IAmazonS3的默认注册,因此触发报错。 - 额外的
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
相关产品推荐
相关产品推荐

