2

RavenDBのドキュメントキーに使用したいクラスがあります。

public class DocumentKey
{
    public string Namespace { get; set; }
    public string Id { get; set; }
}

ITypeConverterまた、参照型から文字列に変換するための(.NETのものではなく、RavenDB固有の)インターフェイスを実装しました(データベースでは、キーはすべて実際には文字列であるため)。

最後に、プロパティを介して公開されることによりITypeConverter、の実装を実装に追加しました。IDocumentStoreList<ITypeConverter>Conventions.IdentityProviders

ただし、実装のLoadAsync<T>オーバーロードの署名は次のようになります(簡潔にするために複数のIDを使用する署名を削除しました。また、インターフェイスIAsyncDocumentSessionの場合と同じです)。LoadIDocumentSession

LoadAsync<T>(string id);
LoadAsync<T>(ValueType id);

次の理由から、キーに値型を使用したくありません。

  • キーのタイプに制約のない抽象化があります。値型を持つためだけにこれをミラーリングするために別個の構造を作成することは非常に不便です。
  • 値型に制限されているため、型を完全に制御することはできません。値型にはデフォルトのコンストラクターがあり、コード内の他の場所で処理する必要がない方法で値をデフォルト設定します。

RavenDBで参照型をドキュメントキーとして使用するにはどうすればよいですか?

4

1 に答える 1

2

すべてのドキュメント識別子は最終的にRavenDBに文字列として格納されるため、キーは文字列を受け取るオーバーロードを使用しています。

LoadAsync<T>(string id);

インターフェイスから、 (によって公開される)、具体的には次の署名を持つデリゲートIAsyncDocumentSessionを使用できます。ConventionsAdvanced.DocumentStore.ConventionsFindFullDocumentKeyFromNonStringIdentifier

string FindFullDocumentKeyFromNonStringIdentifier(
    object id, Type type, bool allowNull);

パラメータの機能は次のとおりです。

  • id-これは、ドキュメントの識別子として使用されているオブジェクトです。上記の例では、それはDocumentKeyインスタンスになります。これはobject(ではなくValueType)として入力されるため、ここでは参照型が受け入れられます。
  • type-が属するTypeアイテムのタイプを表すインスタンス。idを呼び出すときLoadAsync<T>、これはtypeof(T)です。
  • allowNull-これはallowNull、の実装で公開されITypeConverter.ConvertFromたスルーに追加されるパラメータとして渡されます。IdentityProvidersConventions

これはすべて、次のように強く型付けされた拡張メソッドにまとめることができますIAsyncDocumentSession(または必要にIDocumentSession応じて変更できます)。

static Task<T> LoadAsync<T, TId>(this IAsyncDocumentSession session, TId id)
{
    // Validate parameters.
    if (session == null) throw new ArgumentNullException("session");
    // Check if the id is null.
    if ((object) id == null) throw new ArgumentNullException("id");

    // Get the string id.
    string stringId = session.Advanced.DocumentStore.Conventions.
        FindFullDocumentKeyFromNonStringIdentifier(id, typeof(T), true);

    // Load using the string id.
    return session.LoadAsync<T>(stringId);
}

if ((object) id == null)このシナリオでは、比較によってパフォーマンスに影響が出る可能性があることに注意してください。

于 2012-12-22T17:41:20.777 に答える