[OR] Jak określić żywotność StructureMap do UOW do spożycia przez żądania HTTP i pracy kwarcuStructureMap zwraca umieszczoną nHibenrate sesji przedmiotu z nici zasięgu lokalnego
mam tę aplikację internetową, która wykorzystuje SM, dla IoC. Używam zakresu HybridHttpOrThreadLocalScoped do przechowywania moich obiektów NHibernate ISession. Działa to dobrze w sesji na modę zapytania dla moich żądań internetowych.
Ale mam również quartz.net, który planuje kilka zadań. Zadanie korzysta z tej samej jednostki pracy, aby uzyskać obiekt ISession. W tym scenariuszu, gdy program planujący rozpoczyna zadanie, wszystko działa poprawnie na początku, a zadanie działa dobrze przez kilka razy, WCZEŚNIEJ identyfikator wątku zadania zostanie powtórzony.
Wyobraź sobie, że gdy zadanie jest zaplanowane, zaczyna działać w wątkach z identyfikatorami 11, 12, 13, a następnie ponownie z identyfikatorem wątku 11. W tym momencie structuremap zwraca obiekt sesji, który jest już usuwany i otrzymuję "System.ObjectDisposedException: Session is closed!" błąd.
Z tego co widzę, sesja jest przechowywana w lokalnym magazynie wątków, a po zakończeniu sesji na końcu jednostki pracy obiekt sesji jest nadal przechowywany w lokalnym magazynie wątków. Wygląda na to, że po zakończeniu wątku jego lokalna pamięć nie zostanie wyczyszczona iw jakiś sposób po utworzeniu nowego wątku o tym samym identyfikatorze, structuremap wyszukuje sesję w starym wątku lokalnego magazynu (który ma zostać wyczyszczony dla nowego wątku Wierzę) i zwraca obiekt sesji, który jest już usuwany.
Pytania:
- Czy istnieje sposób, aby wyczyścić pamięć lokalna wątku (na zakończenie)?
- Czy istnieje odpowiednik opcji "ReleaseAndDisposeAllHttpScopedObjects" dla obiektów o zakresie gwintu?
- Czy istnieje sposób na unieważnienie (lub wyrzucenie) unieszkodliwionego obiektu, więc nawet jeśli SM go szuka, to nie znajdzie żadnego i będzie musiał utworzyć nowe wystąpienie?
Mam nadzieję, że moje pytanie było jasne. To zajęło mi kilka godzin mojego czasu i wciąż nie znalazłem sposobu na obejście tego. Doceniam wszelkie podpowiedzi:>
Aktualizacja: dodałem własne rozwiązanie, aby dokonać UOW podawane przez pracę StructureMap z obu żądań HTTP i pracy kwarcowych. Daj mi znać, jeśli masz lepsze/łatwiejsze/prostsze rozwiązanie.
Zarządzasz swoim kwarcowy IJobs z StructureMap? –
@Mauricio: Używam StructureMap w mojej aplikacji. Nie jestem pewien, co masz na myśli, zarządzając robotami kwarcowymi przez StructeMap:> – kaptan
to twoje kwarcowe IJob zarządzane przez StructureMap? Innymi słowy: czy rejestrujesz swoje prace w kontenerze? –