Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌入RavenDb的单态_C#_.net_Singleton_Ravendb - Fatal编程技术网

C# 嵌入RavenDb的单态

C# 嵌入RavenDb的单态,c#,.net,singleton,ravendb,C#,.net,Singleton,Ravendb,为什么当我使用这个单例时,load Retrieve总是空的 public class DataLayer { private EmbeddableDocumentStore d; private static object lockerSingleton = new object(); private static DataLayer _current; public static DataLayer RavenDB { get

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

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());
        }
    }
}
公共类数据层
{
私人嵌入式文档库d;
私有静态对象lockerSingleton=新对象();
专用静态数据层\u当前;
公共静态数据层RavenDB
{
得到
{
lock(lockerSingleton)
{
如果(_current==null)
_当前=新数据层();
}
返回电流;
}
}
公共数据层()
{          
d=新的EmbeddedBleDocumentStore(){DataDirectory=“csv”};
d、 初始化();
}
公共仓库(T obj)
{
使用(var session=d.OpenSession())
{
会话存储(obj);
session.SaveChanges();
}
}
公共T检索(对象ID)
{
使用(var session=d.OpenSession())
{
返回session.Load(ID.ToString());
}
}
}

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

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

而且,泛型T在存储上是多余的,您也可以只使用对象


但是请注意我关于不在Raven中使用存储库模式的评论。它隐藏了Raven的绝大多数功能,当您开始查询时会给您带来麻烦。

请给我们举一个
ID
的例子。按照惯例,Raven对ID进行编码,如:
posts/1
if
T:Post
。所以仅仅通过1是行不通的。。除非
T
具有
int
属性
Id
,否则您的代码在没有单例模式的情况下是否可以工作?我觉得锁有点奇怪。通常一个IDocumentStore的静态实例就足够了,可以选择由DI管理。您能提供一个完整的示例吗?看起来您正在尝试实现存储库模式。不要。THX我将在明天尝试,在博客中,他建议为每个http请求初始化会话,所以对于Ms mvc 3,为每个操作初始化会话,对吗?你知道把初始化代码放在global.asax的begin请求中是否更可取吗?如果知道,请确保在请求结束时处理它。raven指南对您的控制器基类说:您还可以向它注入DI框架,该框架实现每个web请求的生命周期。还有其他选择。真正重要的是,每个请求都有自己的会话实例,但它们都共享同一个文档存储。正如您所说的ToString()导致了这个问题,谢谢