2013-01-23 78 views
2

我已經開始編寫一個小的ASP.NET MVC 4項目。到目前爲止,沒有一個前端,但是,當我開始使用API​​時,我的項目將會暴露。 API是使用Web API的API控制器創建的。 API控制器訪問存儲在Raven DB數據庫中的數據。當使用VS 2012和IIS Express調試我的代碼時,一切正常。在第一次請求期間,也就是說。在第二個請求中,Raven DB IDocumentStore對象(即數據庫連接對象)已被處置,我不知道它是如何發生的。如何使用VS2012來調試對象被丟棄的時間?

我用Ninject注入IDocumentStore對象到我的倉庫對象和Ninject是設置這樣的:

public class NinjectModule: Ninject.Modules.NinjectModule { 
    readonly string _connStrName; 

    IDocumentStore _store; 

    public NinjectModule(string connStrName) { 
     _connStrName = connStrName; 
    } 

    public override void Load() { 
     _store = new DocumentStore { ConnectionStringName = _connStrName }; 
     _store.Initialize(); 

     Bind<IDocumentStore>().ToConstant(_store); 
    } 

    public override void Unload() { 
     _store.Dispose(); 

     base.Unload(); 
    } 
} 

IDocumentStore設置在Unload方法,但是,據我所知道的,Unload方法永遠不會被調用。

如果有人能告訴我爲什麼我的IDocumentStore被丟棄,但是我會解決它的調試方式,當它真正被處置時,這將是非常棒的。當特定對象被丟棄時,我可以觸發嗎?

我已經非常仔細地檢查過,並且IDocumentStore對象永遠不會被我的(仍然非常小的)代碼庫處置。

+0

爲什麼不能在'IDocumentStore.Dispose()'方法中放置斷點,然後從調用堆棧的位置查看調用堆棧。不過,我的建議是綁定'IDocumentStore''InRequestScope()'並使用'OnePerRequestModule'使其工作。它會根據HTTP請求創建對象,並在最後自動處理它。在整個應用程序生命中保持一個數據庫連接並不是一個好主意,它可能會導致併發性和性能問題。 – mipe34

+0

@ mipe34一個'IDocumentStore'是一個單身人士。看到我的答案。 –

+0

mipe34:是否有可能在我沒有任何源代碼的方法中添加斷點?如果是這樣,怎麼樣?我沒有IDocumentStore實現的代碼。那麼,Raven DB是開源的,所以我想我可以自己構建它,但我寧願不... –

回答

0

我不確定這是否是問題,但RavenDB IDocumentStore應具有單實例生存期範圍,而IDocumentSession應具有每個請求範圍。

我自己使用AutoFac,但如何在Ninject中定義生命週期範圍的快速搜索產生了this page

請嘗試添加.InSingletonScope()適當的IDocumentStore,看看是否可以解決問題。

如果您打算在會話中使用Ninject,那麼它看起來像.InRequestScope()將是適當的選項。

+0

我已經考慮過了。綁定()。ToConstant(_store)調用使IDocumentStore的實例的所有請求都返回_store實例。有效地使它成爲一個單身人士。我也試着添加InSingletonScope()調用來確保它沒有任何區別。 –

相關問題