RavenDB的单例DocumentStore

时间:2016-11-01 04:58:12

标签: asp.net-mvc singleton ravendb document-store

我是使用RavenDB的新手。 我的理解是我们必须首先创建一个DocumentStore,然后打开一个会话以便将数据保存到数据库中。 从文档中,我了解到我们不应该每次都创建实例,并且应该只使用单例来创建DocumentStore。 但我意识到大多数文档或教程每次只演示创建实例。

仅供参考,我正在使用ASP.NET MVC框架。

所以这是我的问题,

  1. 应该在CreatingDocumentStore.cs(Singleton类)的文件夹中 放在哪里?在应用程序文件夹的根目录中?
  2. 创建这个单例类之后,如何使用它?
  3. 以下是使用Singleton之前我的AdminController的原始代码。我不知道如何更改它以使用单例类 - CreatingDocumentStore.cs

    如果有人可以通过显示代码来演示使用Singleton,我将不胜感激。提前致谢!

    Controller文件夹中的

    AdminController.cs

    public class AdminController : Controller
    {
    
        public ActionResult Index()
        {
    
            using (var store = new DocumentStore
            {
                Url = "http://localhost:8080/",
                DefaultDatabase = "foodfurydb"
            })
            {
                store.Initialize();
    
                using (var session = store.OpenSession())
                {
                    session.Store(new Restaurant
                    {
                        RestaurantName = "Boxer Republic",
                        ResCuisine = "Western",
                        ResAddress = "Test Address",
                        ResCity = "TestCity",
                        ResState = "TestState",
                        ResPostcode = 82910,
                        ResPhone = "02-28937481"
                    });
    
                    session.SaveChanges();
    
                }
            }
    
            return View();
        }
    
        public ActionResult AddRestaurant()
        {
            return View();
        }
    }
    
    根文件夹

    CreatingDocumentStore.cs

     public class CreatingDocumentStore
    {
        public CreatingDocumentStore()
        {
            #region document_store_creation
            using (IDocumentStore store = new DocumentStore()
            {
                Url = "http://localhost:8080"
            }.Initialize())
            {
    
            }
            #endregion
        }
    
        #region document_store_holder
        public class DocumentStoreHolder
        {
            private static Lazy<IDocumentStore> store = new Lazy<IDocumentStore>(CreateStore);
    
            public static IDocumentStore Store
            {
                get { return store.Value; }
            }
    
            private static IDocumentStore CreateStore()
            {
                IDocumentStore store = new DocumentStore()
                {
                    Url = "http://localhost:8080",
                    DefaultDatabase = "foodfurydb"
                }.Initialize();
    
                return store;
            }
        }
        #endregion
    }
    

1 个答案:

答案 0 :(得分:1)

正如Ayende在他的博客上发布的Managing RavenDB Document Store startup

  

RavenDB的文档存储是您的主要访问点   数据库。强烈建议您只有一个   每个要访问的服务器的文档存储的实例。那   通常意味着你必须实现一个单独的,所有的   双重检查锁定的废话。

他向我们展示了一个例子:

public static class Global
{
    private static readonly Lazy<IDocumentStore> theDocStore = new Lazy<IDocumentStore>(()=>
        {
            var docStore = new DocumentStore
                {
                    ConnectionStringName = "RavenDB"
                };
            docStore.Initialize();

            //OPTIONAL:
            //IndexCreation.CreateIndexes(typeof(Global).Assembly, docStore);

            return docStore;
        });

    public static IDocumentStore DocumentStore
    {
        get { return theDocStore.Value; }
    }
}

您要放置它的位置取决于您的架构。通常我们会在database中放置Infrastructure个连接等。如果您有一个项目,则可以放在项目的根目录中,或者创建一个包含database项目的文件夹。

您可以从stackoverflow中查看这些帖子: