gpt4 book ai didi

.net - 如何配置 Simple Injector IoC 以使用 RavenDB

转载 作者:行者123 更新时间:2023-12-04 16:48:20 25 4
gpt4 key购买 nike

我正在使用 Simple Injector对于 MVC 3 Web 应用程序中的 IOC。我正在使用 RavenDB用于数据存储。在 mvc 3 应用程序中使用 RavenDB 有几个注意事项。我已经搜索了一些关于如何连接 IoC 以使用 RavenDB,但还没有找到如何连接简单注入(inject)器以使用 RavenDB。谁能解释如何连接简单的注入(inject)器以在 MVC 3 Web 应用程序中使用 RavenDB?

谢谢。

最佳答案

根据RavenDb tutorial ,您的应用程序恰好需要一个 IDocumentStore实例(我假设每个数据库)。一个 IDocumentStore是线程安全的。它产生 IDocumentSession实例,它们代表 unit of work在 RavenDB 中,这些是 不是 线程安全的。因此,您应该 不是 在线程之间共享 session 。

如何设置容器以与 RavenDb 一起使用主要取决于应用程序设计。问题是:你想给消费者注入(inject)什么? IDocumentStore ,或 IDocumentSession ?

当您使用 IDocumentStore ,您的注册可能如下所示:

// Composition Root
IDocumentStore store = new DocumentStore
{
ConnectionStringName = "http://localhost:8080"
};

store.Initialize();

container.RegisterSingle<IDocumentStore>(store);

消费者可能看起来像这样:
public class ProcessLocationCommandHandler
: ICommandHandler<ProcessLocationCommand>
{
private readonly IDocumentStore store;

public ProcessLocationCommandHandler(IDocumentStore store)
{
this.store = store;
}

public void Handle(ProcessLocationCommand command)
{
using (var session = this.store.OpenSession())
{
session.Store(command.Location);

session.SaveChanges();
}
}
}

因为 IDocumentStore注入(inject)后,消费者自己负责管理 session :创建、保存和处置。这对于小型应用程序非常方便,或者例如在将 RavenDb 数据库隐藏在 repository 后面时非常方便。 ,您调用 session.SaveChanges()里面 repository.Save(entity)方法。

但是,我发现这种类型的工作单元使用对于大型应用程序来说是有问题的。所以你可以做的是注入(inject) IDocumentSession进入消费者。在这种情况下,您的注册可能如下所示:
IDocumentStore store = new DocumentStore
{
ConnectionStringName = "http://localhost:8080"
};

store.Initialize();

// Register the IDocumentSession per web request
// (will automatically be disposed when the request ends).
container.RegisterPerWebRequest<IDocumentSession>(
() => store.OpenSession());

请注意,您需要 Simple Injector ASP.NET Integration NuGet package (或将 SimpleInjector.Integration.Web.dll 包含在您的项目中,默认下载中包含)以便能够使用 RegisterPerWebRequest扩展方法。

现在的问题是,在哪里调用 session.SaveChanges() ?

有一个关于根据 Web 请求注册作品单元的问题,它也解决了关于 SaveChanges 的问题。 .请好好看看这个答案: One DbContext per web request…why? .当您替换单词 DbContextIDocumentSessionDbContextFactoryIDocumentStore ,您将能够在 RavenDb 的上下文中阅读它。请注意,在使用 RavenDb 时,业务交易或一般交易的概念可能并不那么重要,但老实说我不知道​​。这是你必须自己找出来的。

关于.net - 如何配置 Simple Injector IoC 以使用 RavenDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10940988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com