public ExpireTracking(IScheduler scheduler, ILogger <ExpireTracking> logger, TrackingConfiguration config)
        {
            if (scheduler == null)
            {
                throw new ArgumentNullException(nameof(scheduler));
            }

            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
            this.config = config ?? throw new ArgumentNullException(nameof(config));
            logger.LogDebug("Constructing. Expire: {0} Scan: {0}", config.Expire, config.ScanTime);
            subscription = Observable.Interval(config.ScanTime, scheduler).Subscribe(item => Scan());
        }
        public PersistencyTracking(ILogger <PersistencyTracking> logger, TrackingConfiguration configuration, IRatingStream stream, IRestorer restorer)
        {
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (restorer == null)
            {
                throw new ArgumentNullException(nameof(restorer));
            }

            if (string.IsNullOrEmpty(configuration?.Persistency))
            {
                throw new ArgumentNullException(nameof(configuration.Persistency));
            }

            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
            logger.LogInformation("Creating persistency {0}", configuration.Persistency);
            Path.GetDirectoryName(configuration.Persistency).EnsureDirectoryExistence();
            restorer.Load(configuration.Persistency);
            var subscription = stream.Stream.Subscribe(item => Process(item.Item1, item.Item2));

            disposable.Add(subscription);
            configuration.Persistency.Backup();
            streamWriter = new StreamWriter(configuration.Persistency, false);
            disposable.Add(streamWriter);
            writer = new CsvWriter(streamWriter, CultureInfo.CurrentCulture);
            disposable.Add(writer);
            writer.WriteField("Date");
            writer.WriteField("Tag");
            writer.WriteField("Type");
            writer.WriteField("Id");
            writer.WriteField("Rating");
            writer.NextRecord();
        }