【发布时间】: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
感谢代码更新。为了测试这一点,我有:
- 创建了 NancyFx/Nancy 主分支的本地克隆 GitHub
- 在我的解决方案中添加了 Nancy.csproj 并引用了该项目
- 运行与上述相同的测试
来自新 DynamicDictionary 的 RavenDB 文档
{
"Name": "test",
"Data": {
"$type": "Nancy.DynamicDictionary, Nancy",
"username": {},
"age": {}
}
}
您可以看到生成的文档是一个改进。 DynamicDictionary 类型信息现在被 RavenDB 正确获取,而动态属性名称已正确序列化,不幸的是动态属性值没有。
下图展示了DynamicDictionary 的新外观。对我来说一切都很好,新的字典界面清晰可见。我唯一注意到的是调试器中的动态“结果视图”(与“动态视图”相反)只显示属性名称而不是它们的值。 “动态视图”与以前一样显示(见上图)。
DynamicDictionary 在运行时的内容
【问题讨论】:
标签: ravendb dynamic-language-runtime nancy