using YLErp.Abstract.DataProviders;
namespace YLErp.Modules.DataProviderModule
{
///
/// 价格提供接口实现(数据来自手动添加)
///
public class ManualPriceProvider : IPriceProvider
{
readonly Dictionary _priceDic;
public ManualPriceProvider(IDictionary priceDic = null)
{
_priceDic = priceDic == null
? new Dictionary(StringComparer.OrdinalIgnoreCase)
: new Dictionary(priceDic, StringComparer.OrdinalIgnoreCase);
}
public ManualPriceProvider SetPrice(string instrumentId, double price)
{
if (!string.IsNullOrEmpty(instrumentId))
{
_priceDic[instrumentId] = price;
}
return this;
}
public double GetPrice(string instrumentId)
{
return !string.IsNullOrEmpty(instrumentId) && _priceDic.TryGetValue(instrumentId, out var price) ? price : 0;
}
public bool TryGetPrice(string instrumentId, out double price)
{
price = 0;
return !string.IsNullOrEmpty(instrumentId) && _priceDic.TryGetValue(instrumentId, out price);
}
public bool Contains(string instrumentId)
{
return _priceDic.ContainsKey(instrumentId);
}
public static implicit operator ManualPriceProvider(Dictionary priceDic)
{
return new ManualPriceProvider(priceDic);
}
}
///
/// 单个UnderlyingID对应的价格提供接口实现
///
public class SinglePriceProvider : IPriceProvider
{
readonly double _price;
readonly string _instrumentId;
public SinglePriceProvider(string instrumentId, double price)
{
_instrumentId = instrumentId ?? throw new ArgumentNullException(nameof(instrumentId));
_price = price;
}
public double GetPrice(string instrumentId)
{
return _instrumentId.Equals(instrumentId, StringComparison.OrdinalIgnoreCase) ? _price : 0;
}
public bool TryGetPrice(string instrumentId, out double price)
{
if (_instrumentId.Equals(instrumentId, StringComparison.OrdinalIgnoreCase))
{
price = _price;
return true;
}
price = 0;
return false;
}
}
///
/// 多个价格提供接口聚合提供价格
///
public class AggregatePriceProvider : IPriceProvider, IAggregatePriceProvider
{
readonly IEnumerable _priceProviders;
public AggregatePriceProvider(params IPriceProvider[] priceProviders)
{
_priceProviders = priceProviders ?? Enumerable.Empty();
}
public double GetPrice(string instrumentCode)
{
return TryGetPrice(instrumentCode, out var price) ? price : 0;
}
public bool TryGetPrice(string instrumentCode, out double price)
{
foreach (var provider in _priceProviders)
{
if (provider != null && provider.TryGetPrice(instrumentCode, out price))
{
return true;
}
}
price = 0;
return false;
}
}
}