Mam dość standardową aplikację MVC 5 składającą się z warstwy repozytorium, warstwy usługi i warstwy kontrolera. Aby zachować oddzielenie i testowanie każdej warstwy, używam programu Ninject do wstrzykiwania zależności.ASP.NET MVC 5 Zarządzanie kontekstem asynchronicznym
Aby odświeżyć nowe umiejętności, zdecydowałem się użyć nowych akcji kontrolera zadań z asynchronizacją/oczekiwaniem na operacje związane z IO dla usług i metod kontrolera.
Normalnie po prostu skorzystać z InRequestScope wiązania jak tak
kernel.Bind<IDbContext>().To<BlogContext>().InRequestScope();
W ogóle to działa dobrze teraz, jednak jeśli wybrałem debugować mojej aplikacji, lub połączyć kilka gąsienicowa Entity Framework obiektów razem i zapisać, Stwierdzam, że kontekst został usunięty lub pojawiają się problemy z śledzeniem. Rozumiem, dlaczego tak się dzieje, jest to całkowicie logiczne, ponieważ operacja nie ma już miejsca w wątku IIS, więc w jaki sposób Ninject wie, że powinien używać tego samego kontekstu.
Aby obejść ten problem, mogę przekazać kontekst do każdego wywołania repozytorium z poziomu mojej warstwy usługi lub nawet z poziomu kontrolera, jeśli zajdzie taka potrzeba. Jednak czuję, że wygląda to niechlujnie i wolałbym, aby Ninject zarządzał kontekstem tego obiektu, jeśli to możliwe.
Jakie są najlepsze strategie radzenia sobie z tym w elegancki/minimalistyczny sposób, zachowując mój kod podobny do przykładów podanych poniżej?
Oto przykład jednego z moich metod kontroler
public virtual async Task<ActionResult> Edit(int id)
{
var editViewModel = await BuildDefaultCreateEditViewModel();
var post = await postService.GetNonDeletedPost(id);
...
...
return View(MVC.Admin.Post.Views.CreateEdit, editViewModel);
}
metody usługi
public async Task<PostDTO> GetNonDeletedPost(int postId)
{
return (await PostRepostiory.GetPost(postId)).ConvertToDTO();
}
metoda Repository
public Task<Post> GetPost(int postId)
{
return QueryableExtensions.SingleOrDefaultAsync(
DbSet.Where(post => post.PostId == postId)
.Include(post => post.PostVersions)
.Include(post => post.Categories)
.Include(post => post.Files));
}
Używasz DbContextFactory? I mają tendencję do używania 'TransientScope' zamiast Życzenie, a ja nigdy nie mam żadnych problemów –
skutecznie nadzieję, że mogę używać Ninject w sposób podobny do DbContextFactory podobny do korzystania InRequestScope. Gdybym miał zejść trasę korzystania z DBContextFacotry problem jaki mam wiedzieć, które zwracają się do asynchronicznej wątek należy do wciąż widoczne, jak mogę negować tego? chodzi o zakres korzystania przejściowy, który stworzy nowy kontekst za repozytorium, które jest dobre dla usług, które korzystają z jednego, ale kiedy używam kilka (wzór elewacji) szwy obiektów razem i oszczędność nie będzie działać jako obiekty z różnych repozytoriów będzie pod różne śledzone konteksty. – jps
Tak, jak używam ninject, z DbContextFactory, pozwala mi wstrzyknąć kontekst do repozytorium wszystkie w TransientScope. :) –