2011-04-01 58 views
8

注意:這裏有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的一個最後一個問題(與上面的代碼稍有關係)是關於釋放對象的問題。如果你看看這個教程:

http://codeofrob.com/archive/2010/09/29/ravendb-image-gallery-project-iii-the-application-lifecycle.aspx

的最後一塊代碼:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 

和該代碼的點是爲了防止泄漏的會話。現在,我還需要擔心Autofac的問題,如果是的話,我如何在Autofac中執行此操作?

回答

11

我猜你想要的東西,如:

builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope(); 

「的默認ASP.NET和WCF集成的設置,以便InstancePerLifetimeScope()將附加組件添加到當前Web請求或服務方法調用「。 - Autofac: InstanceScope

基本上,在一個web應用程序中,InstancePerLifetimeScope處理每個HTTP上下文方面的一個,並且還配置實現IDisposable的任何類型。

+1

@ryanzec:InstancePerLifetimeScope非常值得更詳細的瞭解。 Autofac的作者有一篇關於容器背後用途的精彩文章,以及它適合你的應用的地方:http://blogs.msdn.com/b/nblumhardt/archive/2008/12/27/container-managed-application-設計前奏-其中此結果的容器-belong.aspx – 2011-04-02 04:00:53

1

還有一個問題,OpenSession返回一個IDocumentSession而不是DocumentSession。謝謝,改變我的課程以尋找一個IDocumentSession和Jim建議的工作。