【问题标题】:Why does storing a Nancy.DynamicDictionary in RavenDB only save the property-names and not the property-values?为什么在 RavenDB 中存储 Nancy.DynamicDictionary 只保存属性名称而不保存属性值?
【发布时间】:2012-06-24 15:33:02
【问题描述】:

我正在尝试保存(RavenDB build 960)通过其内置Request.Form 传递到 Nancy 模块的表单数据项的名称和值。

如果我保存dynamic 对象的简单实例(带有测试属性和值),那么一切正常,并且属性名称和值都被保存。但是,如果我使用 Nancy 的 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 并且只取回动态成员名称而不是成员名称/值对。

谁能告诉我如何或是否可以将 Request.Form 视为dynamic 对象以将其保存到 RavenDB?如果可能的话,我想避免任何手工枚举 DynamicDictionary 来构建 dynamic 实例,以便 RavenDB 可以正确序列化。

谢谢

编辑 1 @Ayende

DynamicDictionary 似乎实现了GetDynamicMemberNames() 方法:

查看 GitHub 上的代码可以发现以下实现:

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

这是您希望在这里看到的吗?

编辑 2 @TheCodeJunkie

感谢代码更新。为了测试这一点,我有:

  1. 创建了 NancyFx/Nancy 主分支的本地克隆 GitHub
  2. 在我的解决方案中添加了 Nancy.csproj 并引用了该项目
  3. 运行与上述相同的测试

来自新 DynamicDictionary 的 RavenDB 文档

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

您可以看到生成的文档是一个改进。 DynamicDictionary 类型信息现在被 RavenDB 正确获取,而动态属性名称已正确序列化,不幸的是动态属性值没有。

下图展示了DynamicDictionary 的新外观。对我来说一切都很好,新的字典界面清晰可见。我唯一注意到的是调试器中的动态“结果视图”(与“动态视图”相反)只显示属性名称而不是它们的值。 “动态视图”与以前一样显示(见上图)。

DynamicDictionary 在运行时的内容

【问题讨论】:

    标签: ravendb dynamic-language-runtime nancy


    【解决方案1】:

    生物分形, 问题是 DynamicDictionary,在 JSON 中,类型可以是对象或列表,它们不能同时是两者。 而对于动态对象序列化,我们依靠 GetDynamicMemberNames() 的实现来获取属性,我认为不存在。

    【讨论】:

    • GetDynamicMemberNames() 确实存在 github.com/NancyFx/Nancy/blob/master/src/Nancy/… 我刚刚将 IDictionary 添加到 DynamicDictionary 中,它将被推送到 master,并成为今天 0.12 版本的一部分
    • @TheCodeJunkie。请参阅上面的编辑 2。对不起,我很困惑。您描述的修复是否旨在允许 RavenDB 序列化属性值?或者我应该在序列化之前将表单数据项传输到标准字典中吗?谢谢。
    • 您可以尝试从源代码构建(阅读我们的如何在 repo 中构建文件并获取本地 nugets),看看是否解决了它。您的问题引发了 IDictionary 的实施,这是我们之前讨论过但从未有时间去做的事情
    • @TheCodeJunkie。那太棒了。再次感谢代码更新。我将尝试使用本地 nugets 运行源代码。我发现(参见上面的编辑 2)创建对最新 Nancy 源项目的简单引用并不能解决我的问题,即动态值没有序列化到 RavenDB,也许我需要你建议的本地 nugets? FWIW,您是否创建了单元测试以查看新的 DynamicDictionary 是否允许动态键/值序列化?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多