2011-02-16 64 views
7

我想確定每個請求結束後結構圖是否會處理我的DataContext。StructureMap處理DataContext對象

這裏是我的設置

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 
SelectConstructor<MyDataContext>(() => new MyDataContext()); 

將structuremap自動處理我的DataContext還是需要手動調用Dispose?

回答

4

不,它不會自動處理它,除非您使用嵌套容器並處理容器中的上下文實例。這取決於上下文的創建者來處理它。創建者通常是代碼的一部分,調用ObjectContext.GetInstance<MyDataContext>或使得StructureMap將DataContext注入到其中一個對象中的根方法。

通常的做法是根據HttpRequest創建一個上下文,並在請求結束時處理上下文。

9

這就是我做的:

For<IUnitOfWork>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use<BpReminders.Data.NH.UnitOfWork>(); 

    For<ISession>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession); 

和...

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

HybridHttpOrThreadLocalScoped使用的HttpContext時可用。

然後,StructureMap會處理所有事情。 只記得在你的課堂上實施IDisposable

+0

儘管在SM中使用HybridHttpOrThreadLocalScoped將使用ThreadLocal存儲,但調用ReleaseAndDisposeAllHttpScopedObjects時會引發異常。你能告訴我你是如何設法處理存儲在ThreadLocal中的對象的? – Roman 2011-06-23 04:26:30

+0

@Am:你不能使用HybridHttpOrThreadLocalScoped是HttpContextLifecycle的成員。我已經看到ThreadLocalStorageLifecycle(這是你感興趣的)有一個名爲EjectAll的方法。我從來沒有用過它,想過,也從來沒有真正深入這個。 – LeftyX 2011-06-23 08:31:26