using System.Collections.Concurrent; using YLErp.Abstract; namespace YLErp.Modules.TradeRiskCalcModule.TaskRunner { /// /// [线程安全]凤凰期权票息累积数据源 /// class AutocallObservationDataSource : ITradeExtendUpdater, IDataUpdater { readonly Guid _eventGuid; readonly ConcurrentDictionary _dic; private AutocallObservationDataSource() { _dic = new ConcurrentDictionary(); _eventGuid = Events.EventBus.Subscribe(t => { UpdateData(t.TradeIds); }); } ~AutocallObservationDataSource() { Events.EventBus.Unsubscribe(_eventGuid); } public List GetDatas(int tradId) { if (!_dic.TryGetValue(tradId, out var datas)) { using (var db = DbContextFactory.GetYLDbContext()) { _dic[tradId] = datas = db.autocall_observation.AsNoTracking() .Where(n => n.TradeId == tradId).OrderBy(n => n.PaymentDate).ToArray(); } } return datas.Select(t => t.Clone()).ToList(); } /// /// 跟随trade更新 /// public void UpdateData(IEnumerable tradeIds) { if (_dic.Count > 5000) { _dic.Clear(); return; } if (tradeIds == null || !tradeIds.Any()) { return; } foreach (var tradId in tradeIds) { _dic.TryRemove(tradId, out _); } } public void UpdateData(IEnumerable updateKeyIds) { var tradeIds = DataConvert.ConvertToInt32Array(updateKeyIds); this.UpdateData(tradeIds); } /// /// 偷个懒使用这个 /// public static readonly AutocallObservationDataSource Default; public string TableName => "autocall_observation"; static AutocallObservationDataSource() { Default = new AutocallObservationDataSource(); } } }