2015-10-20 22 views
0

我試圖找出如何設置StructureMap3配置,即在既有的WebAPI,並在控制檯應用程序的工作,如:StructureMap3 HybridHttpOrThreadLocalScoped沒有HttpSessionState

For<ISession>().HybridHttpOrThreadLocalScoped().Use(p => p.GetInstance<TestingContainer>().GetSession()); 

對於控制檯應用程序,我想的對象只要線程存活,只要http會話存在,就可以存活。

這可能與MVC網站有關,因爲HybridHttpOrThreadLocalScoped使用HttpSessionState來確定是創建新實例還是重用現有實例。

WebApi沒有這個HttpSessionState,因此HybridHttpOrThreadLocalScoped將不起作用。

如果我不在乎控制檯應用程序,那麼我可能會用Transient()或AlwaysUnique或類似的配置結構圖。

那麼,當沒有HttpSessionState實例時,相當於HybridHttpOrThreadLocalScoped是什麼。

謝謝。

編輯

-to重新安排的問題...

回答

0

一般來說,你應該有利於爲Nested Containers生命週期管理。這背後的原因正是你剛剛提到的,在某些情況下,使用線程,HTTP或混合作用域根本無法工作。我曾經看到,在人們認爲數據庫連接正在處理的地方,因爲他們處於其他環境中,但在一個環境中,他們不是。另外,明確性很好。

爲此,將每個請求處理的依賴項設置爲Transient(默認值),並在請求結束時處理嵌套容器。我已經在webapi here中寫過這個工作流程。另外official docs推薦this nuget

因爲你會想要做這樣的事情的控制檯應用程序:

//parent Container set up at app start 
public void On_UserAction() 
{ 
    //global container set up at app start, either use ObjectFactory (bad, deprecated and to be removed) or just keep track of it yourself. 
    using(var nestedContainer = GlobalContainer.GetNestedContainer()) 
    { 
     var dependency = nestedContainer.GetInstance<DependencyThatHandlesUserInput>(); 
    } 
} 

,就是這樣,using塊處理所有的處置你。

如果您還有其他問題,請提問,我在這類事情上花了很多時間:)。

+0

從某種意義上說,我同意你的邏輯,但是如果你在同一個嵌套容器中創建兩個線程會發生什麼?我想我們不希望嵌套容器和線程之間存在依賴關係,我們必須記住爲每個新線程創建了一個新的嵌套容器,或者....? –

相關問題