【问题标题】:C# Calling two classes that have the same interfaceC#调用两个具有相同接口的类
【发布时间】: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

我怎样才能让这两种方法都被击中?而不是为KafkaConsumerKafkaConsumerB 使用相同的接口(@98​​7654331@),如果我创建另一个与IKafkaConsumer 完全相同的接口,但为KafkaConsumerBIKafkaConsumerB,然后注册它,然后两种方法叫我怎么想。由于两个接口都是重复的,我希望能简化一下。

【问题讨论】:

    标签: c# inheritance


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2010-09-22
      相关资源
      最近更新 更多