问题描述
如何使用多个 API/秘密密钥 DI 多个客户端?我当前的实现只能使用相同的 API/密钥注入一个 BinanceClient
和 BinanceSocketClient
。
是否可以通过内置的 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
对象。