注意:這裏有3個問題,我沒有提出單獨的問題,因爲它們都與相同的代碼有點相關。ASP.NET MVC 3,RavenDB和Autofac Issue Plus 2其他Autofac問題
我有以下的代碼,每個應用程序的生命週期,一旦登記在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會話''
對我來說這個錯誤聽起來像Autofac不認爲它有一個DocumentSession,但是這是什麼store.OpenSession()返回,所以它應該。任何人都知道會導致這個錯誤?我沒有正確設置會話變量(它與存儲變量正常工作正常)?
可能與上述問題相關或不相關的另一件事是,如何根據請求將對象的實例添加到Autofac而不是每個應用程序生命週期?雖然RavenDB DocumentStore對象只能在生命週期中創建一次,但是應該爲每個請求創建一次DocumentSession(可能會爲每個應用程序級別創建它導致上述錯誤)。
我會拋出關於Autofac的一個最後一個問題(與上面的代碼稍有關係)是關於釋放對象的問題。如果你看看這個教程:
的最後一塊代碼:
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
和該代碼的點是爲了防止泄漏的會話。現在,我還需要擔心Autofac的問題,如果是的話,我如何在Autofac中執行此操作?
@ryanzec:InstancePerLifetimeScope非常值得更詳細的瞭解。 Autofac的作者有一篇關於容器背後用途的精彩文章,以及它適合你的應用的地方:http://blogs.msdn.com/b/nblumhardt/archive/2008/12/27/container-managed-application-設計前奏-其中此結果的容器-belong.aspx – 2011-04-02 04:00:53