public TradeService(ILogger logger,TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //construct a cache specifying that the primary key is Trade.Id _tradesSource = new SourceCache<Trade, long>(trade => trade.Id); //call AsObservableCache() to hide the update methods as we are exposing the cache _all = _tradesSource.AsObservableCache(); //create a derived cache _live = _tradesSource.Connect(trade => trade.Status == TradeStatus.Live).AsObservableCache(); //code to emulate an external trade provider var tradeLoader = GenerateTradesAndMaintainCache(); //expire closed items from the cache ro avoid unbounded data var expirer = _tradesSource .ExpireAfter(t => t.Status == TradeStatus.Closed ? TimeSpan.FromMinutes(1) : (TimeSpan?)null,TimeSpan.FromMinutes(1),schedulerProvider.TaskPool) .Subscribe(x=>_logger.Info("{0} filled trades have been removed from memory",x.Count())); //log changes var loggerWriter = LogChanges(); _cleanup = new CompositeDisposable(_all, _tradesSource, tradeLoader, loggerWriter, expirer); }
public TradeService(ILogger logger, TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //construct a cache specifying that the primary key is Trade.Id _tradesSource = new SourceCache <Trade, long>(trade => trade.Id); //call AsObservableCache() to hide the update methods as we are exposing the cache _all = _tradesSource.AsObservableCache(); //create a derived cache _live = _tradesSource.Connect(trade => trade.Status == TradeStatus.Live).AsObservableCache(); //code to emulate an external trade provider var tradeLoader = GenerateTradesAndMaintainCache(); //expire closed items from the cache ro avoid unbounded data var expirer = _tradesSource .ExpireAfter(t => t.Status == TradeStatus.Closed ? TimeSpan.FromMinutes(1) : (TimeSpan?)null, TimeSpan.FromMinutes(1), schedulerProvider.TaskPool) .Subscribe(x => _logger.Info("{0} filled trades have been removed from memory", x.Count())); //log changes var loggerWriter = LogChanges(); _cleanup = new CompositeDisposable(_all, _tradesSource, tradeLoader, loggerWriter, expirer); }
public TradeService(ILogger logger, TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //construct a cache specifying that the unique key is Trade.Id _tradesSource = new SourceCache <Trade, long>(trade => trade.Id); //call AsObservableCache() to hide the update methods as we are exposing the cache _tradesCache = _tradesSource.AsObservableCache(); //code to emulate an external trade provider var tradeLoader = GenerateTradesAndMaintainCache(); _cleanup = new CompositeDisposable(_tradesCache, _tradesSource, tradeLoader); }
public TradeService(ILogger logger,TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //construct a cache specifying that the unique key is Trade.Id _tradesSource = new SourceCache<Trade, long>(trade => trade.Id); //call AsObservableCache() to hide the update methods as we are exposing the cache _tradesCache = _tradesSource.AsObservableCache(); //code to emulate an external trade provider var tradeLoader = GenerateTradesAndMaintainCache(); _cleanup = new CompositeDisposable(_tradesCache, _tradesSource, tradeLoader); }
public TradeService(ILogger logger, TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //emulate a trade service which asynchronously var tradesData = GenerateTradesAndMaintainCache().Publish(); //call AsObservableCache() so the cache can be directly exposed All = tradesData.AsObservableCache(); //create a derived cache Live = tradesData.Filter(trade => trade.Status == TradeStatus.Live).AsObservableCache(); //log changes var loggerWriter = LogChanges(); _cleanup = new CompositeDisposable(All, tradesData.Connect(), loggerWriter); }
public TradeService(ILogger logger,TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //construct a cache specifying that the primary key is Trade.Id _tradesSource = new SourceCache<Trade, long>(trade => trade.Id); //call AsObservableCache() to hide the update methods as we are exposing the cache _all = _tradesSource.AsObservableCache(); //create a child cache _live = _tradesSource.Connect(trade => trade.Status == TradeStatus.Live).AsObservableCache(); //code to emulate an external trade provider var tradeLoader = GenerateTradesAndMaintainCache(); //log changes var loggerWriter = LogChanges(); _cleanup = new CompositeDisposable(_all, _tradesSource, tradeLoader, loggerWriter); }
public TradeService(ILogger logger, TradeGenerator tradeGenerator, ISchedulerProvider schedulerProvider) { _logger = logger; _tradeGenerator = tradeGenerator; _schedulerProvider = schedulerProvider; //construct a cache specifying that the primary key is Trade.Id _tradesSource = new SourceCache <Trade, long>(trade => trade.Id); //call AsObservableCache() to hide the update methods as we are exposing the cache _all = _tradesSource.AsObservableCache(); //create a child cache _live = _tradesSource.Connect(trade => trade.Status == TradeStatus.Live).AsObservableCache(); //code to emulate an external trade provider var tradeLoader = GenerateTradesAndMaintainCache(); //log changes var loggerWriter = LogChanges(); _cleanup = new CompositeDisposable(_all, _tradesSource, tradeLoader, loggerWriter); }
public TradeService(ILogger logger, TradeGenerator tradeGenerator, OcDispatcher backgroundOcDispatcher) { _logger = logger; _tradeGenerator = tradeGenerator; _backgroundOcDispatcher = backgroundOcDispatcher; All = new ObservableCollection <Trade>(_tradeGenerator.Generate(5_000, true)); Live = All.Filtering(t => t.Status == TradeStatus.Live).For(_consumer); var random = new Random(); TimeSpan RandomInterval() => TimeSpan.FromMilliseconds(random.Next(2500, 5000)); // create a random number of trades at a random interval RecurringAction tradeEmitter = new RecurringAction(() => { var number = random.Next(1, 5); var trades = _tradeGenerator.Generate(number); foreach (Trade trade in trades) { _backgroundOcDispatcher.Invoke(() => All.Add(trade)); } }, RandomInterval); List <Trade> closedTrades = new List <Trade>(); //close a random number of trades at a random interval RecurringAction tradeCloser = new RecurringAction(() => { var number = random.Next(1, 2); for (int i = 1; i <= number; i++) { _backgroundOcDispatcher.Invoke(() => { Trade trade = All[random.Next(0, All.Count - 1)]; trade.Status = TradeStatus.Closed; trade.CloseTimestamp = DateTime.Now; closedTrades.Add(trade); }); } }, RandomInterval); //expire closed items from the cache to avoid unbounded data RecurringAction tradeRemover = new RecurringAction(() => { _backgroundOcDispatcher.Invoke(() => { for (var index = closedTrades.Count - 1; index >= 0; index--) { Trade closedTrade = closedTrades[index]; if ((DateTime.Now - closedTrade.CloseTimestamp).Minutes >= 1) { All.Remove(closedTrade); closedTrades.RemoveAt(index); } } }); }, () => TimeSpan.FromMinutes(1)); //log changes OcDispatcher logPropertyChangedOcDispatcher = new OcDispatcher(); LogChanges(logPropertyChangedOcDispatcher); _cleanup = new CompositeDisposable( _consumer, tradeEmitter, tradeCloser, logPropertyChangedOcDispatcher, tradeRemover); }