我可以在C#DocumentDb驱动程序中使用多态/继承吗?

时间:2015-09-09 10:46:39

标签: c# .net inheritance polymorphism azure-cosmosdb

我有一个自定义表单对象结构,我成功使用mongodb。

我一直在研究用DocumentDb替换Mongo的可能性。

我的类结构由不同类型的控件继承的基本控件组成。例如文本框控件,下拉控件

在mongo中我使用discriminator字段来存储实际类型,在c#DocumentDb驱动程序中我看不到找到相同的功能。

下面是mongo如何存储我的类结构的示例。

{
  "_t" : "TextboxControl",
  "LabelText" : "Location of incident",
  "IsRequired" : true,
  "_id" : "cbe059d9-b6a9-4de2-b63b-14d44b022e37"
}

在documentdb中,结构看起来像

{
  "LabelText": "Location of incident",
  "IsRequired": true,
  "id": "cbe059d9-b6a9-4de2-b63b-14d44b022e37"
}

正如您所看到的那样,mongo版本具有一个“_t”属性来说明实际类型,然后在读取数据时使用它来创建正确的类型。在documentdb版本中,它只是一个字段类型

2 个答案:

答案 0 :(得分:3)

经过数周的搜索,我终于找到了答案

https://github.com/markrexwinkel/azure-docdb-linq-extension

这个库基本上扩展了DocumentDb的C#SDK,允许应用自定义JSON设置。在幕后,documentdb驱动程序用户json.net。

我现在得到了财产" $ type"这是一个内置于newtonsoft的优秀json.net库中的功能。

我的json现在看起来像

{
  "$type" : "MyNameSpace.DropDownSingleFormBuilderControlTemplate, MyLibrary",
  "LabelText" : "Label Text"
  "IsRequired" : true,
  "_id" : "cbe059d9-b6a9-4de2-b63b-14d44b022e37"
}

答案 1 :(得分:1)

我认为他们增加了对jsonserializer的支持。您可以通过
RequestOptions,TypeNameHandling.All

添加它
var s =  new RequestOptions(){ JsonSerializerSettings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All }}
var result = await Client.CreateDocumentAsync(CollectionUri, @event2, s);