C#调用两个具有相同接口的类

C# Calling two classes that have the same interface

如何调用具有相同接口的两个方法?我有一个后台服务,通过调用 ConsumeMessagesFromQueue.

从 kafka 队列中读取消息
public class InboundWorker : BackgroundService
{
    private readonly IKafkaConsumer _kafkaConsumer;

    public InboundWorker(IKafkaConsumer kafkaConsumer)
    {
        _kafkaConsumer = kafkaConsumer;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        await _kafkaConsumer.ConsumeMessagesFromQueue(stoppingToken).ConfigureAwait(false);
    }
}

这是界面:

public interface IKafkaConsumer
{
    Task ConsumeMessagesFromQueue(CancellationToken cancellationToken);
}

我有一个 class 那个界面:

public class KafkaConsumer : IKafkaConsumer
{
    private readonly AppSettings _appSettings;

    public KafkaConsumer(IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings;
    }

    public async Task ConsumeMessagesFromQueue(CancellationToken cancellationToken)
    {
        await Task.Delay(1);
    }
}

我希望能够 return 并处理来自另一个 kafka 队列的数据。所以我正在考虑创建另一个 class 也实现上面的接口 IKafkaConsumer 像这样:

public class KafkaConsumerB : IKafkaConsumer
{
    private readonly AppSettings _appSettings;

    public KafkaConsumerB(IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings;
    }

    public async Task ConsumeMessagesFromQueue(CancellationToken cancellationToken)
    {
        await Task.Delay(1);
    }
}

我的 ioc 设置如下:

services.AddSingleton<IKafkaConsumer, KafkaConsumer>();
services.AddSingleton<IKafkaConsumer, KafkaConsumerB>();

然而,经过上述更改后,ConsumeMessagesFromQueue 会在 KafkaConsumerB 时被命中,但不会 KafkaConsumer

如何让两种方法都被命中?如果我创建另一个与 IKafkaConsumer 完全相同的接口,而不是对 KafkaConsumerKafkaConsumerB 使用相同的接口 (IKafkaConsumer),而是对 IKafkaConsumerB =19=],并注册它,然后这两种方法都会按照我的意愿被调用。由于两个接口都是重复的,我希望能简化一些事情。

如果您想同时使用这两种接口实现,则可以使用 IEnumerable 注入它们。

private readonly IEnumerable<IKafkaConsumer> _kafkaConsumer;

    public InboundWorker(IEnumerable<IKafkaConsumer> kafkaConsumer)
    {
        _kafkaConsumer = kafkaConsumer;
    }

然后使用 foreach 循环调用方法。