【发布时间】:2022-01-13 15:46:22
【问题描述】:
如何调用具有相同接口的两个方法?我有一个后台服务,它通过调用 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);
}
我有一个具有该接口的类:
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);
}
}
我也希望能够从另一个 kafka 队列返回和处理数据。所以我正在考虑创建另一个类,它也实现了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。
我怎样才能让这两种方法都被击中?而不是为KafkaConsumer 和KafkaConsumerB 使用相同的接口(@987654331@),如果我创建另一个与IKafkaConsumer 完全相同的接口,但为KafkaConsumerB 说IKafkaConsumerB,然后注册它,然后两种方法叫我怎么想。由于两个接口都是重复的,我希望能简化一下。
【问题讨论】:
标签: c# inheritance