2017-11-18 113 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版本。