Singleton for Embedded RavenDb

时间:2012-10-18 18:18:08

标签: c# .net singleton ravendb

为什么当我使用这个单例时,load retreive总是为空?

public class DataLayer
{
    private  EmbeddableDocumentStore d;
    private static object lockerSingleton = new object();

    private static DataLayer _current;
    public static DataLayer RavenDB
    {
        get
        {
            lock (lockerSingleton)
            {
                if (_current == null)
                    _current = new DataLayer();
            }
            return _current;
        }
    }

    public DataLayer()
    {          

                d = new EmbeddableDocumentStore() { DataDirectory = "csv" };
                d.Initialize();              
    }

    public void  store<T>(T obj)
    {
        using (var session = d.OpenSession())
        {
            session.Store(obj);
            session.SaveChanges();
        }
    }
    public T retrieve<T>(object ID)
    {
        using (var session = d.OpenSession())
        {
            return session.Load<T>(ID.ToString());
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您说您的对象有一个整数Id字段。因此,假设您有一个Foo的对象,其Id设置为1. Raven将使用文档ID“foos / 1”存储您的文档。

当您调用Load时,如果传入整数1,Raven会将其正确转换回“foos / 1”字符串。但是因为你传入字符串“1”,raven只是假设字符串代表整个文档id。在你的情况下,它没有。文档ID为“1”的文档不存在,因此您将获得null。

此外,通用T在商店中是多余的,您也可以只使用对象。

但是请注意我没有在Raven中使用Repository模式的评论。它隐藏了Raven的绝大部分功能,并在您开始查询时遇到麻烦。