Asp.net mvc 4 如何使RavenDB DocumentStore可用于调用API

Asp.net mvc 4 如何使RavenDB DocumentStore可用于调用API,asp.net-mvc-4,ravendb,membership-provider,roleprovider,document-store,Asp.net Mvc 4,Ravendb,Membership Provider,Roleprovider,Document Store,我有一个使用RavenDB作为数据存储的MVC4应用程序。该应用程序具有MVC/Web、域、数据和安全层 我正在编写需要初始化数据库和访问DocumentStore的自定义成员资格和角色提供程序。我从安全层编写这些类,并希望使用singleton DocumentStore(在应用程序中设置),但我不知道如何访问它 我还看到了一些为RavenDB编写自定义提供程序的示例,它们在Provider.Initialize()方法中创建了新的DocumentStore实例,但这似乎打破了每台服务器只有一

我有一个使用RavenDB作为数据存储的MVC4应用程序。该应用程序具有MVC/Web、域、数据和安全层

我正在编写需要初始化数据库和访问DocumentStore的自定义成员资格和角色提供程序。我从安全层编写这些类,并希望使用singleton DocumentStore(在应用程序中设置),但我不知道如何访问它

我还看到了一些为RavenDB编写自定义提供程序的示例,它们在Provider.Initialize()方法中创建了新的DocumentStore实例,但这似乎打破了每台服务器只有一个DocumentStore的规则

目前,我在应用程序_Start()中创建了RavenDB DocumentStore的一个实例。我在MVC/Web层中有一个基本控制器,用于处理DocumentStore.Session


有没有办法做到这一点?我应该将我的安全逻辑移到MVC/Web层以简化事情吗?

您可能想使用某种依赖注入,或者使用TinyIoC之类的自动工具,或者手动执行

例如,看看浣熊如何做到这一点。首先,它在应用程序启动时创建DocumentStore实例,并将引用存储在各种基类的静态变量中:

然后,每当新会话启动时,它就会注入一个新会话对象:

此项将从控制器基类中提取:

如果使用适当的IoC,或者至少不使用Items字典,我会做得更好一些,但你明白了


只需将DocumentStore放在公共的地方,并将开放会话注入基类

我使用单例模式提出了自己的解决方案

我所做的是在我的应用程序的数据层中创建一个单例,它公开了一个公共IDocumentStore属性。它使用一个静态构造函数,该构造函数在第一次请求静态属性时运行(在应用程序启动时执行),然后实例化IDocumentStore对象。然后,在基本控制器和我的应用程序的其他层(如安全层f.ex.)中,为每个对DocStore.instance的引用返回初始实例


感谢synhershko的回复。这似乎是可行的,但当我看到你的反应时,我已经实施了一个解决方案。它非常相似(减去DI)。[见下文]
public sealed class DocStore
{
    protected static readonly IDocumentStore instance;

    static DocStore()
    {
        // instantiate documentStore
        instance = new DocumentStore { ConnectionStringName = Constants.ConnectionStrings.XXXXX };
        instance.Initialize();

        // instantiate tenants
        try
        {
            instance.DatabaseCommands.EnsureDatabaseExists(Constants.Tenants.XXXXX);
        }
        catch (Exception ex)
        {

            //TODO: catch exception
            throw ex;
        }

        // initialize indexed
        try
        {
            InitializeIndexes(instance);
        }
        catch (Exception ex)
        {

            //TODO: catch exception
            throw ex;
        }
    }

    private DocStore()
    {

    }

    public static IDocumentStore Instance
    {
        get { return instance; }
    }

    private static void InitializeIndexes(IDocumentStore store)
    {
        // builds all indexes defined in XXXXX.Data.dll
        var dataCatalog = new CompositionContainer(new AssemblyCatalog(typeof(DocStore).Assembly));
        IndexCreation.CreateIndexes(dataCatalog,
                                    store.DatabaseCommands.ForDatabase(Constants.Tenants.XXXXX),
                                    store.Conventions);
    }
}