3

組み込みのRequest.Form.

オブジェクトの単純なインスタンスdynamic(テスト プロパティと値を含む) を保存すると、すべてが機能し、プロパティ名と値の両方が保存されます。ただし、ナンシーのものを使用するとRequest.Form、動的プロパティ名のみが保存されます。

動的データ (RavenJObjects など) を取得するときに正しい型を復元するために、さらに問題に対処する必要があることは理解していますが、今のところ、最初に動的な名前/値を保存する問題を解決したいと考えています。

テスト リクエストとコード全体を次に示します。

フィドラー リクエスト (PUT) ここに画像の説明を入力

ナンシー・モジュール

Put["/report/{name}/add"] = parameters =>
    {
        reportService.AddTestDynamic(Db, parameters.name, Request.Form);
        return HttpStatusCode.Created;
    };

サービス

public void AddTestDynamic(IDocumentSession db, string name, dynamic data)
{
    var testDynamic = new TestDynamic
    {
            Name = name,
            Data = data
    };
    db.Store(testDynamic);
    db.SaveChanges();
}

TestDynamic クラス

public class TestDynamic
{
    public string Name;
    public dynamic Data;
}

実行時の Request.Form の動的コンテンツ ここに画像の説明を入力

結果の RavenDB ドキュメント

{
  "Name": "test",
  "Data": [
    "username",
    "age"
  ]
}

: Request.Form のタイプはNancy.DynamicDictionary. から継承されIEnumerable<string>、期待されるIEnumerable<string, object>. RavenDB はDynamicDictionary、メンバー名と値のペアではなく、動的なメンバー名のみを列挙していると思います。

dynamicRavenDB に保存することに関して、Request.Form をオブジェクトとして扱う方法、または扱うことができるかどうかを誰か教えてもらえますか? 可能であれば、RavenDB が正しくシリアル化できるように、インスタンスDynamicDictionaryを構築するために手作りの列挙を避けたいと考えています。dynamic

ありがとうございました

編集 1 @Ayende

DynamicDictionary はGetDynamicMemberNames()メソッドを実装しているようです:

Nancy.DynamicDictionary

GitHub のコードを見ると、次の実装が明らかになります。

public override IEnumerable<string> GetDynamicMemberNames()
{
    return dictionary.Keys;
}

これはあなたがここで見たいものですか?

編集2 @TheCodeJunkie

コードの更新をありがとう。これをテストするために私は持っています:

  1. GitHub から NancyFx/Nancy master ブランチのローカル クローンを作成しました
  2. 私のソリューションに Nancy.csproj を追加し、プロジェクトを参照しました
  3. 上記と同じテストを実行します

新しい DynamicDictionary からの RavenDB ドキュメント

{
  "Name": "test",
  "Data": {
    "$type": "Nancy.DynamicDictionary, Nancy",
    "username": {},
    "age": {}
  }
}

結果のドキュメントが改善されていることがわかります。型情報はDynamicDictionaryRavenDB によって正しく取得されるようになり、動的プロパティ名は正しくシリアル化されますが、残念ながら動的プロパティ値はシリアル化されません。

下の画像は、動作中の新しい外観を示していますDynamicDictionary。私にはすべて問題ないように見えます。新しい辞書インターフェイスがはっきりと見えます。私が気付いた唯一のことは、デバッガーの動的な「結果ビュー」(「動的ビュー」とは対照的に) が、プロパティ名のみを表示し、それらの値を表示しないことでした。「動的ビュー」は、以前と同じように両方を示しています (上の画像を参照)。

実行時の DynamicDictionary の内容 ここに画像の説明を入力

4

1 に答える 1

1

バイオフラクタル、問題はDynamicDictionaryです.JSONでは、型はオブジェクトまたはリストのいずれかになりますが、両方になることはできません. また、動的オブジェクトのシリアル化では、プロパティを取得するために GetDynamicMemberNames() の実装に依存していますが、それは存在しないと思います。

于 2012-06-25T07:34:50.740 に答える