Mój projekt składa się z usług i repozytoriów (wszystkie repozytoria współużytkują kontekst db). W jednej z moich warstw usług mam asynchroniczną metodę, która zapisuje do bazy danych przy użyciu repozytorium. Żądanie internetowe zakończy i pozbędzie się kontekstu, zanim ta metoda będzie mogła go użyć. Próbowałem zrozumieć NamedScopes, jak podano w tym answer. Wciąż nie mogę zrozumieć, jak to wdrożyć. Pokażę, jak zbudowany jest mój projekt i mam nadzieję, że ktoś może mi pomóc na poziomie kodu.Wiązania NamedScopes i asynchronizacja (gwintowanie)
Wiązania
private static void RegisterServices(IKernel kernel)
{
//dbcontext
kernel.Bind<EntityDatabaseContext>().ToMethod(context => new EntityDatabaseContext()).InRequestScope();
//unit of work
kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
//repositories
kernel.Bind<IRepository<Account>>().To<Repository<Account>>().InRequestScope();
//services
kernel.Bind<IAuthenticationService>().To<AuthenticationService>().InRequestScope();
}
AuthenticationService wykorzystuje konstruktora wtrysku
public AuthenticationService(UnitOfWork unitOfWork, IRepository<Account> accountRepository){}
Sposób w moim AuthenticationService
//this is a background process
public Task SomeMethodAsync(string text)
{
//spin it off into a new task
return Task.Factory.StartNew(() => SomeMethod(text));
}
SomeMethod
korzysta z accountRepository
. Proszę mi powiedzieć, czy potrzebne są już jakieś informacje. Proszę pomóż mi w kwestii wątków, jeśli NamedScopes jest rozwiązaniem, w jaki sposób mogę go wdrożyć w moim przypadku?
Zasadniczo proces w tle jest wykonywany i korzysta z kontekstu, który jest usuwany przez ninject ze względu na zakres żądania.
Mógłbyś proszę wyjaśnić, co chcesz osiągnąć? Czy chcesz po prostu załadować niektóre dane w metodzie SomeMethodAsync asynchronicznie lub chcesz, aby w tle przetwarzane były pewne informacje w pracy podobnej do mody? Jednym z głównych problemów w projekcie jest to, że zaczynasz bezpośrednio nowe zadanie w SomeMethodAsync. Uruchomienie nowego zadania nie daje żadnej obietnicy dotyczącej wykonania zadania.Zadania mogą być wykonywane po zakończeniu twojego żądania, a następnie ninject będzie już umieszczony w zasięgu żądania. Jeśli używasz AsyncController, zadanie powinno zostać na nim zarejestrowane. Ale API nie powinien go uruchamiać. –
@DanielMarbach To jest mój problem, zadanie może zostać wykonane po tym, jak żądanie się zakończy, a ninject porzuca kontekst. Muszę powiedzieć niniemu, żeby zaczekał. Nie wiem, jak to zrobić. –
@ DanielMarbach co masz na myśli mówiąc, że interfejs API nie powinien go uruchamiać? –