public class CaseMonitor { private readonly HostSettings _settings; private readonly ILogger _logger; private readonly ISystemTime _systemTime; private readonly IModelBuilder<RecentCaseModel> _caseModelBuilder; private DateTime _lastPolled; private TimeSpan _interval; private Timer _timer; private IDisposable _loggingContext; public CaseMonitor(HostSettings settings, ILogger logger, ISystemTime systemTime, IModelBuilder<RecentCaseModel> caseModelBuilder) { _settings = settings; _logger = logger; _systemTime = systemTime; _caseModelBuilder = caseModelBuilder; _interval = TimeSpan.FromSeconds(15); _lastPolled = systemTime.Now.Subtract(_interval); } public bool Start() { //The logging context will have the instance of this windows service just in case there are multiple services. //This is done just to show a scenario for consuming the host settings object we get from Topshelf. _loggingContext = _logger.Push(_settings.InstanceName); //create a timer in charge of doing the recurreing polling for open cases _timer = new Timer(_interval.TotalMilliseconds); _timer.Elapsed += pollForOpenCases; _timer.Start(); return true; } private void pollForOpenCases(object sender, ElapsedEventArgs elapsedEventArgs) { var from = _lastPolled; var to = _systemTime.Now; //using a ModelMap to project cases created between the last poll and now var cases = _caseModelBuilder.Get(f => f.Between("creation_time", from, to)); _logger.LogInfo("{0} cases were created in the last {1} seconds", cases.Length, to.Subtract(from).TotalSeconds); foreach (var kase in cases) { //the debug log will have more details _logger.LogDebug(kase.ToString()); } _lastPolled = to; } public bool Stop() { _timer.Stop(); _loggingContext.Dispose(); return true; } }