2011-06-21 98 views
9

在Windows服务中执行后台任务时,我使用HybridHttpOrThreadLocalScoped来存储NHibernate ISessions的实例。如何在StructureMap中发布HybridHttpOrThreadLocalScoped对象?

由于在Windows Server中没有HTTPContext,我想知道是否只调用ReleaseAndDisposeAllHttpScopedObjects()就足以释放该线程的ISession实例?

+0

你试过吗?结果是什么? – thekip

+0

我不认为这是。我只是试了一下,得到了一个N​​ullReferenceException,我猜是因为没有HttpContext。所以不,该方法绝对不是释放会话的正确方式。 – Roman

回答

15

我发现如何回答这个问题。 ObjectFactory公开的ReleaseAndDisposeAllHttpScopedObjects()方法确实与HttpContext相关,因此也与Web应用程序有关。

Structuremap.Pipeline命名空间中的HybridLifeCycle类允许直接访问ThreadLocal存储中的缓存对象并对其进行处置。下面是一个例子:

Action.For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>(); 

以上代码寄存器所提供的类型和在的HttpContext或ThreadLocal的存储缓存它的实例。从IDisposable继承这些类型总是一个好主意。因此在这个例子中UnitOfWork也是一个IDisposable。

new HybridLifecycle().FindCache().DisposeAndClear(); 

立即处置缓存对象的web应用程序或窗口服务的regardsless上面的行足以处置的UnitOfWork代替ReleaseAndDisposeAllHttpScopedObjects()方法。我希望这可以帮助别人。

+0

谢谢,这真的帮助我! – manu08

+0

你用这个节省了我的一天,谢谢! –