如何配置简单的喷油器的IoC使用RavenDB(How to configure Simple In

2019-07-29 18:46发布

我使用的是简单的注射器为国际奥委会在MVC 3 Web应用程序。 我使用RavenDB用于数据存储。 有在一个MVC 3应用程序中使用RavenDB几方面的考虑。 我搜索了一些关于如何连接,建立一个国际奥委会使用RavenDB但还没有找到如何电线起来简单注射器使用RavenDB。 任何人都可以解释如何线了简单的注射器在MVC 3 web应用程序使用RavenDB?

谢谢。

Answer 1:

按照RavenDb教程 ,您的应用程序需要只有一个IDocumentStore实例(每个数据库我假设)。 一个IDocumentStore是线程安全的。 它产生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());

请注意,您所需要的简单注射器ASP.NET集成NuGet包 (或包括SimpleInjector.Integration.Web.dll到您的项目,其中包括在默认下载),以便能够使用RegisterPerWebRequest扩展方法。

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

还有一个有关注册每web请求,其还解决了有关的问题作品单元问题SaveChanges 。 请把这个答案很好看: 每个web请求一个的DbContext ......为什么呢? 。 当您更换字DbContextIDocumentSessionDbContextFactoryIDocumentStore ,你将能够在RavenDb的情况下阅读。 请注意,RavenDb工作时可能的商业交易或成交一般的概念并不是那么重要,但我真的不知道。 这是你必须找到自己。



文章来源: How to configure Simple Injector IoC to use RavenDB