[ИЛИ] Как да дефинираме жизнения цикъл на StructureMap за UoW, който да се използва от http заявки и кварцови задания
Имам това уеб приложение, което използва SM за IoC. Използвам HybridHttpOrThreadLocalScoped обхват, за да съхранявам моите nHibernate ISession обекти. Това работи добре в режим на сесия на заявка за моите уеб заявки.
Но също така имам quartz.net, който планира няколко работни места. Заданието използва същата единица работа, за да получи обекта ISession. В този сценарий, когато планировчикът стартира заданието, всичко работи добре отначало и заданието работи добре няколко пъти, ДОКАТО идентификаторът на нишката на заданието не се повтори.
Представете си, че когато заданието е планирано, то започва да се изпълнява в нишки с идентификатори 11, 12, 13 и след това отново с идентификатор на нишка 11. В този момент structuremap връща обект на сесия, който вече е изхвърлен и получавам "System.ObjectDisposedException: Сесията е затворена!" грешка.
Така че от това, което виждам, сесията се съхранява в локално хранилище на нишка и след като изтрия сесията в края на моята работна единица, обектът на сесията все още се съхранява в локалното хранилище на нишката. Изглежда, че след прекратяване на нишката нейното локално хранилище не се изчиства и по някакъв начин, когато се създаде нова нишка със същия идентификатор, structuremap търси сесията в старото локално хранилище на нишката (което се предполага, че е изчистен за новата нишка според мен) и връща обекта на сесията, който вече е изтрит.
Въпроси:
- Има ли начин да изчистите локалното хранилище на нишката (при прекратяване)?
- Има ли еквивалент на „ReleaseAndDisposeAllHttpScopedObjects“ за обекти с обхват на нишка?
- Има ли начин да анулира (или изхвърли) изхвърления обект, така че дори SM да го търси, тогава няма да намери такъв и трябва да създаде нов екземпляр?
Надявам се, че изясних въпроса си. Това отне няколко часа от времето ми и все още не съм намерил начин да го заобиколя. Оценявам всеки намек :>
Актуализация: Добавих мое собствено решение, за да накарам UoW, обслужван от StructureMap, да работи както с http заявки, така и с кварцови задачи. Уведомете ме, ако имате по-добро/по-лесно/просто решение.