У меня есть несколько функций, использующих веб-сокеты, и я хотел переместить следующие логи c в другой класс.
Проблема в том, что если я переместу Ticker
в этот другой класс, то я бы приходится повторять его каждый раз на _socketClient.SubscribeToKlineUpdates
, потому что это также подписка на веб-сокеты, которая убивает идею веб-сокетов. Единственный способ - это, вероятно, оставить Ticker
в WhwhatStrategy.cs и переместить метод GetTicker в этот другой класс. Но тогда как он может обновлять свойство из другого класса каждый раз?
Как я могу сделать эти вспомогательные методы, такие как GetTicker
, повторно используемыми? Примите во внимание, что каждая стратегия logi c выполняется в другой подписке на веб-сокет: _socketClient.SubscribeToKlineUpdates
, и Wh whatStrategy порождает несколько потоков.
WhwhatStrategy.cs
public interface IStrategy
{
void Start(Bot bot, CancellationToken token);
}
public class WhateverStrategy : IStrategy
{
/// <summary>
/// Gets tickers.
/// </summary>
public BinanceStreamTick Ticker { get; set; }
/// <summary>
/// Gets prices.
/// </summary>
private void GetTicker(string symbol)
{
var price = _client.Get24HPrice(symbol);
while (!price.Success)
{
price = _client.Get24HPrice(symbol);
}
var ticker = new BinanceStreamTick
{
LowPrice = price.Data.LowPrice,
HighPrice = price.Data.HighPrice,
OpenPrice = price.Data.OpenPrice,
BestAskQuantity = price.Data.AskQuantity,
BestAskPrice = price.Data.AskPrice,
BestBidQuantity = price.Data.BidQuantity,
BestBidPrice = price.Data.BidPrice,
CloseTradesQuantity = price.Data.LastQuantity,
CurrentDayClosePrice = price.Data.LastPrice,
PrevDayClosePrice = price.Data.PreviousClosePrice,
WeightedAverage = price.Data.WeightedAveragePrice,
PriceChangePercentage = price.Data.PriceChangePercent,
PriceChange = price.Data.PriceChange,
Symbol = price.Data.Symbol
};
Ticker = ticker;
_socketClient.SubscribeToSymbolTickerUpdates(symbol, (data) => Ticker = data);
}
public void Start(Bot bot, CancellationToken token)
{
GetTicker(bot.Symbol);
_socketClient.SubscribeToKlineUpdates(bot.Symbol, bot.Interval, data =>
{
// another web socket
});
}
}
SocketHelper. cs (повторная попытка, но свойство?)
/// <summary>
/// This class getting data using web sockets,
/// in order to reduce requests.
/// </summary>
public class SocketHelpers
{
private readonly IBinanceClient _client;
private readonly IBinanceSocketClient _socketClient;
public SocketHelpers(IBinanceClient client, IBinanceSocketClient socketClient)
{
_client = client;
_socketClient = socketClient;
}
/// <summary>
/// Gets tickers.
/// </summary>
public BinanceStreamTick Ticker { get; set; }
/// <summary>
/// Gets prices.
/// </summary>
private void GetTicker(string symbol)
{
var price = _client.Get24HPrice(symbol);
while (!price.Success)
{
var weight = BinanceHelpers.UsedWeight(price.ResponseHeaders);
Globals.Instance.HandleRateLimits(weight.Value);
price = _client.Get24HPrice(symbol);
}
var ticker = new BinanceStreamTick
{
LowPrice = price.Data.LowPrice,
HighPrice = price.Data.HighPrice,
OpenPrice = price.Data.OpenPrice,
BestAskQuantity = price.Data.AskQuantity,
BestAskPrice = price.Data.AskPrice,
BestBidQuantity = price.Data.BidQuantity,
BestBidPrice = price.Data.BidPrice,
CloseTradesQuantity = price.Data.LastQuantity,
CurrentDayClosePrice = price.Data.LastPrice,
PrevDayClosePrice = price.Data.PreviousClosePrice,
WeightedAverage = price.Data.WeightedAveragePrice,
PriceChangePercentage = price.Data.PriceChangePercent,
PriceChange = price.Data.PriceChange,
Symbol = price.Data.Symbol
};
Ticker = ticker;
_socketClient.SubscribeToSymbolTickerUpdates(symbol, (data) => Ticker = data);
}
}