5

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

谢谢。

4

1 回答 1

14

根据RavenDb 教程,您的应用程序只需要一个IDocumentStore实例(我假设每个数据库)。AIDocumentStore是线程安全的。它生成IDocumentSession实例,它们代表RavenDB中的一个工作单元,这些不是线程安全的。因此,您不应线程之间共享会话。

如何设置容器以与 RavenDb 一起使用主要取决于应用程序设计。问题是:你想给消费者注入什么?,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是注入的,所以消费者自己负责管理会话:创建、保存和处置。这对于小型应用程序非常方便,或者例如在将 RavenDb 数据库隐藏在存储库后面时,您可以session.SaveChanges()在方法内部调用repository.Save(entity)

但是,我发现这种类型的工作单元使用对于大型应用程序来说是有问题的。因此,您可以做的是将其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 包(或将SimpleInjector.Integration.Web.dll包含在您的项目中,默认下载中包含)才能使用RegisterPerWebRequest扩展方法。

现在的问题变成了,在哪里打电话session.SaveChanges()

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

于 2012-06-07T22:56:21.210 回答