ASP.NET MVC 3、RavenDB 和 Autofac 問題加上 2 其他 Autofac 問題
注意:這裡有 3 個問題,我沒有提出單獨的問題,因為它們都與相同的程式碼有些相關。
我有以下程式碼,每個應用程序的生命週期在 Application_Start 中註冊一次與我的 RavenDB 的連接:
var store = new DocumentStore { Url = "http://localhost:8080" }; store.Initialize(); builder.RegisterInstance(store).SingleInstance();現在這可以正常工作,並且每個應用程序的生命週期應該只創建一次。現在我想將 DocumentSession 添加到 Autofac,所以我嘗試在 Application_Start 中添加:
var session = store.OpenSession(); builder.RegisterInstance(session).SingleInstance();在我的 UserRepository 中,我有以下建構子:
public UserRepository(DocumentStore store, DocumentSession session)當我嘗試執行它時,出現以下執行時錯誤:
無法解析建構子“Void .ctor(Raven.Client.Document.DocumentStore,Raven.Client.Document.DocumentSession)”的參數“Raven.Client.Document.DocumentSession Session”
對我來說,這個錯誤聽起來像 Autofac 不認為它有 DocumentSession 但是那是 store.OpenSession() 返回的,所以它應該。任何人都知道會導致此錯誤的原因是什麼?我是否沒有正確設置會話變數(它與正常工作的儲存變數相同)?
與上述問題可能或可能不相關的另一件事是如何將對象的實例添加到 Autofac 每個請求而不是每個應用程序生命週期?雖然 RavenDB DocumentStore 對象應該只在生命應用程序週期中創建一次,但 DocumentSession 應該在每個請求中創建一次(可能每個應用程序級別創建它會導致上述錯誤)。
最後一個關於 Autofac 的問題(與上面的程式碼略有關聯)是關於釋放對象的。如果您看一下本教程:
最後一段程式碼:
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();這段程式碼的重點是防止會話洩漏。現在這是我還需要為 Autofac 擔心的事情嗎?如果是這樣,我將如何在 Autofac 中執行此操作?
我猜你想要類似的東西:
builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope();“設置了預設的 ASP.NET 和 WCF 集成,以便 InstancePerLifetimeScope() 將組件附加到目前的 Web 請求或服務方法呼叫。” - Autofac:InstanceScope
基本上,在 Web 應用程序中,
InstancePerLifetimeScope處理每個 HTTP 上下文方面,並且還處理任何實現IDisposable.
還有一個問題是 OpenSession 返回 IDocumentSession 而不是 DocumentSession。更改我的班級以查找 IDocumentSession 以及執行 Jim 建議的工作,謝謝。