使用 ASP.NET Core 内置 IoC 容器注入多个客户端而不是一个 片段

问题描述

如何使用多个 API/秘密密钥 DI 多个客户端?我当前的实现只能使用相同的 API/密钥注入一个 BinanceClientBinanceSocketClient

是否可以通过内置的 IServiceProvider 实现?类似的东西:

private readonly IEnumerable<IBinanceClient> _client;
private readonly IEnumerable<IBinanceSocketClient> _socketClient;

片段

var exchangeOptions = Configuration.GetSection(ExchangeOptions.Exchange).Get<ExchangeOptions>();

services.AddTransient<IBinanceClient,BinanceClient>(_ =>
    new BinanceClient(new BinanceClientOptions
    {
        ApiCredentials = new ApiCredentials(exchangeOptions.ApiKey,exchangeOptions.SecretKey),AutoTimestamp = true,AutoTimestampRecalculationInterval = TimeSpan.FromMinutes(30),TradeRulesBehavIoUr = TradeRulesBehavIoUr.AutoComply
    }));
services.AddSingleton<IBinanceSocketClient,BinanceSocketClient>(_ =>
    new BinanceSocketClient(new BinanceSocketClientOptions
    {
        ApiCredentials = new ApiCredentials(exchangeOptions.ApiKey,AutoReconnect = true,ReconnectInterval = TimeSpan.FromSeconds(15)
    }));
[ApiController]
[Route("api/[controller]")]
public class AlertsController : ControllerBase
{
    private readonly ILogger<AlertsController> _logger;
    private readonly IBinanceClient _client;
    private readonly IBinanceSocketClient _socketClient;
    private readonly IAlertService _alertService;

    public AlertsController(ILogger<AlertsController> logger,IBinanceClient client,IBinanceSocketClient socketClient,IAlertService alertService)
    {
        _logger = logger;
        _client = client;
        _socketClient = socketClient;
        _alertService = alertService;
    }

    ...
}

解决方法

您可以在 DI 设置中注入多个版本的服务,如下所示:

services.AddTransient<IBinanceClient,BinanceClient>(/* ... config version 1 ... */);
services.AddTransient<IBinanceClient,BinanceClient>(/* ... config version 2 ... */);
services.AddTransient<IBinanceClient,BinanceClient>(/* ... config version 3 ... */);

现在在你的消费类中,如果你有这个:

public class AlertsController : ControllerBase
{
    private readonly IBinanceClient _client;

    public AlertsController(IBinanceClient client)
    {
        _client = client;
    }
}

那么 IBinanceClient 对象将包含最近添加的服务,在本例中为第三个版本。但是,您的消费服务可以像这样获取所有注入的对象:

public class AlertsController : ControllerBase
{
    private readonly IEnumerable<IBinanceClient> _clients;

    public AlertsController(IEnumerable<IBinanceClient> clients)
    {
        _clients = clients;
    }
}

现在您的消费者将可以访问所有 3 个 IBinanceClient 对象。