using System.Collections.Concurrent; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// [线程安全]交易扩展数据源 /// class TradeExtendDataSource : ITradeExtendUpdater where TData : TradeExtendBase { readonly Guid _eventGuid; readonly ConcurrentDictionary _dic; private TradeExtendDataSource() { _dic = new ConcurrentDictionary(); _eventGuid = Events.EventBus.Subscribe(t => { UpdateData(t.TradeIds); }); } ~TradeExtendDataSource() { Events.EventBus.Unsubscribe(_eventGuid); } /// /// 清空缓存 /// public void Clear() { _dic.Clear(); } /// /// 获取数据 /// public TData GetData(int tradId) { if (!_dic.TryGetValue(tradId, out var data)) { var table = DbContextFactory.GetYLDbContext().Set(); data = table.FirstOrDefault(n => n.TradeId == tradId); if (data != null) { _dic.AddOrUpdate(tradId, data, (k, t) => data); } } return data; } /// /// 跟随trade更新 /// public void UpdateData(IEnumerable tradeIds) { if (_dic.Count > 1000) { _dic.Clear(); return; } if (tradeIds == null || !tradeIds.Any()) { return; } foreach (var tradId in tradeIds) { _dic.TryRemove(tradId, out _); } } /// /// 使用这个主要是偷个懒 /// public static readonly TradeExtendDataSource Default; static TradeExtendDataSource() { Default = new TradeExtendDataSource(); } } }