Scoped lifetime of IUpdateManager<TBot> and polling functionality built in it don't play well together. An entity that performs polling should be a singleton.
IUpdateManager<TBot> functionality should be split to two interfaces:
IUpdateDispatcher<TBot> that performs dispatching and could has either scoped or transient lifetime
An entity that performs actual polling and has dependency on a factory that creates IUpdateDisptacher<TBot> instance and has singleton lifetime so it correctly incapsulates update offset
Scoped lifetime of
IUpdateManager<TBot>
and polling functionality built in it don't play well together. An entity that performs polling should be a singleton.IUpdateManager<TBot>
functionality should be split to two interfaces:IUpdateDispatcher<TBot>
that performs dispatching and could has either scoped or transient lifetimeIUpdateDisptacher<TBot>
instance and has singleton lifetime so it correctly incapsulates update offset