如何呼叫具有相同介面的兩個方法?我有一個后臺服務,它通過呼叫ConsumeMessagesFromQueue.
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。
我怎樣才能讓這兩種方法都被擊中?而不是使用相同的介面(IKafkaConsumer用于)KafkaConsumer和KafkaConsumerB,如果我創建另一個界面,是一個精確復制的IKafkaConsumer,但說IKafkaConsumerB的KafkaConsumerB,然后注冊,那么這兩個方法被呼叫我怎么想。由于兩個介面都是重復的,我希望能簡化一些事情。
uj5u.com熱心網友回復:
如果您想同時使用介面的兩種實作,則可以使用 IEnumerable 注入它們。
private readonly IEnumerable<IKafkaConsumer> _kafkaConsumer;
public InboundWorker(IEnumerable<IKafkaConsumer> kafkaConsumer)
{
_kafkaConsumer = kafkaConsumer;
}
然后使用 foreach 回圈呼叫這些方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381351.html
上一篇:根據班級內容創建子班級
