2017-11-18 111 views
1

我發佈了這個論壇之前搜索了一下這個論壇,因爲我推測它已經被打死了 - 但是因爲我沒有看到任何看起來很清楚的結果,所以我想我會給它一個鏡頭。以前有回答的可能性很高,但我沒有偶然發現一個明確的網頁。RavenDB與IoC/DI - IDocumentStore或我(異步)DocumentSession?

當使用依賴注入,這被認爲是更好的做法?注入整個IDocumentStore,然後根據需要產生一個會話,或者注入適當的IDocumentSessionIAsyncDocumentSession

過去,我在任何地方都注入了IAsyncDocumentSession - 但是現在我發現在幾個地方我實際上需要使用非async會話。這讓我想到如果我剛剛接近完全錯誤地注入烏鴉。

因此,使用IDocumentStore可能會像...

public AsHandler(IDocumentStore store) { RavenStore = store; } 

private IDocumentStore RavenStore { get; set; } 

public async Task Handle() { 
    using(var session = RavenStore.OpenAsyncSession()) { 
     ... // do stuff with an async session 
    } 
} 

但隨後的更具體的會議usecases會出現如...

public AsHandler(IAsyncDocumentSession session) { RavenSession = session; } 

private IAsyncDocumentSession RavenSession { get; set; } 

public async Task Handle() { 
    // do stuff with an async session 
} 

或分別...

public AsHandler(IDocumentSession session) { RavenSession = session; } 

private IDocumentSession RavenSession { get; set; } 

public async Task Handle() { 
    // do stuff with a non-async session 
} 

除了偏好還有什麼區別嗎?我最初的想法是,使用IDocumentSessionIAsyncDocumentSession是更好的生命週期管理,但我可能是錯的。

我使用.NET核心2.0.3StructureMap烏鴉DB 4.040023)明確,但我斷定,這可以適用於任何配置和任何版本。

回答

2

不確定這是否改變了4.0,但到目前爲止DocumentStore的創建被認爲是一個相當昂貴/繁重的操作,因此建議的方法是每個應用程序只創建一次(singleton;更詳細的信息請參閱RavenDb Documentation) 。

另一方面,會話創建相當便宜,因此可以根據需要創建。

您仍然可以將兩個對象(存儲和會話)注入DI,並使用不同的生命週期(單例對瞬態)。

當然,您也可以根據需要設置DI以提供會話的同步或asnyc版本。