Hej, zastanawiam się nad tym, czy moje rozwiązanie jest poprawne. Piszę Web API które ma wykonywać cyklicznie pętle, które mają się uruchamiać w określonych porach dnia lub co jakiś czas. Użytkownik ma możliwość sterowania wykonywaniem pętli poprzez klienta, oraz monitorowania postępu wykonywania pętli, bazując na własnościach postępu.
Na chwilę obecną posiadam rozwiązanie, co do którego poprawności nie do końca jestem przekonany, stąd moje pytanie na tym forum.
Kontroler UpdatesController
, po wysłaniu żądania przez klienta komunikuje się z serwisem TimedUpdating
. W razie potrzeby, czyli żądania z klienta, kontroler też odpytuje serwis o postęp w wykonywaniu pętli, może też poprzez serwis wstrzymać, zatrzymać zupełnie, lub uruchomić wykonywanie pętli. Z racji przechowywania własności postępu serwis jest zarejestrowany jako singleton: services.AddSingleton<ITimedUpdating, TimedUpdating>();
. Serwis też aktualizuje bazę danych. Jako że DB nie powinna być singletonem, jest bodajże Transient
, to pojawia się konflikt, ponieważ EF Core nie pozwala na korzystanie z takiej zależności singletonowi.
Znalazłem tego obejście, poprzez wykorzystanie IServiceScopeFactory
:
using (var scope = _scopeFactory.CreateScope())
{
IRepository _repo = scope.ServiceProvider.GetRequiredService<EFRepository>();
//i tutaj już można korzystać z _repo.
}
Nie do końca podoba mi się takie rozwiązanie. Jedyna alternatywa jaka przychodzi mi do głowy to korzystanie z TempData
i zapisywanie/odczyt w obiekcie wszystkich danych postępu pętli. Wtedy serwis mógłby też pozostać Transient
, ale tutaj chyba są potrzebne ciasteczka.
Może macie jakieś lepsze pomysły?