如何在Autofac中注入同一服务的多个不同构造实例?
如何注册并注入同一接口的多个不同参数实例
当然可以,Autofac完全支持这种场景——你只需要为每个不同topicArn的SnsNotificationService分别注册,之后直接在消费类中注入IEnumerable<INotificationService>就能获取所有实例。
1. 修改服务注册逻辑
你需要为每个目标TopicARN单独注册SnsNotificationService实例,或者通过循环批量注册:
方式一:手动逐个注册
如果TopicARN数量固定,直接多次调用注册方法:
// 注册第一个实例,对应TopicArn1 builder.RegisterType<SnsNotificationService>() .As<INotificationService>() .WithParameter("topicArn", _configuration.TopicArn1); // 注册第二个实例,对应TopicArn2 builder.RegisterType<SnsNotificationService>() .As<INotificationService>() .WithParameter("topicArn", _configuration.TopicArn2);
方式二:批量循环注册
如果TopicARN是从配置中读取的列表,用循环批量注册更高效:
// 从配置中获取所有TopicARN列表 var topicArns = _configuration.GetSection("NotificationTopics").Get<string[]>(); foreach (var topicArn in topicArns) { builder.RegisterType<SnsNotificationService>() .As<INotificationService>() .WithParameter("topicArn", topicArn); }
2. 修改消费类的构造函数注入
将InstanceStateManager的构造函数参数从单个INotificationService改为IEnumerable<INotificationService>,之后就可以遍历所有实例推送消息:
public class InstanceStateManager { private readonly IEnumerable<INotificationService> _notificationServices; private readonly IAmazonEC2 _client; private readonly ILogger<Ec2InstanceStateManager> _logger; private readonly string _instanceName; public InstanceStateManager( IAmazonEC2 client, IEnumerable<INotificationService> notificationServices, ILogger<Ec2InstanceStateManager> logger, IConfiguration config) { _client = client; _notificationServices = notificationServices; _logger = logger; _instanceName = config.ResourceIdentifier; } // 示例:遍历所有通知服务推送消息 public async Task PushStateUpdateAsync(string stateMessage) { foreach (var service in _notificationServices) { try { await service.PublishAsync("实例状态更新", stateMessage); } catch (Exception ex) { _logger.LogError(ex, "向Topic推送状态更新失败"); } } } }
额外说明
- Autofac会自动按注册顺序收集所有实现了
INotificationService的实例,注入到IEnumerable<INotificationService>中。 - 如果后续需要针对特定Topic的实例单独操作,可以使用命名注册(
.Named<INotificationService>("Topic1")),再通过IIndex<string, INotificationService>来按名称获取实例,但当前遍历场景不需要这一步。
内容的提问来源于stack exchange,提问作者smk081
相关产品推荐
相关产品推荐

