0

このシングルトンを使用すると、読み込みの取得が常に null になるのはなぜですか?

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());
        }
    }
}
4

1 に答える 1

1

オブジェクトに整数IDフィールドがあると言います。したがって、Idが1に設定されたFooのオブジェクトがあるとします。RavenはドキュメントIDが「foos/1」のドキュメントを保存します。

Loadを呼び出すときに、整数1を渡すと、Ravenはそれを「foos/1」文字列に適切に変換し直します。ただし、文字列「1」を渡すため、ravenは文字列がドキュメントID全体を表すと想定します。あなたの場合、そうではありません。ドキュメントIDが「1」のドキュメントは存在しないため、nullが発生します。

また、ジェネリックTはストアで冗長であるため、オブジェクトを使用することもできます。

ただし、Ravenでリポジトリパターンを使用しないことについての私のコメントに注意してください。これは、Ravenの機能の大部分を隠し、クエリを開始するときに問題を引き起こします。

于 2012-10-18T21:44:11.507 に答える