2015-09-09 18 views
5

Mam niestandardową strukturę obiektu formularza używam z powodzeniem z mongodb.Czy mogę użyć polimorfizmu/dziedziczenia w sterowniku C# DocumentDb

Badałem możliwość zastąpienia Mongo dokumentemDb.

Struktura mojej klasy składa się z kontrolki podstawowej, z której dziedziczą różne rodzaje kontroli. na przykład Sterowanie polem tekstowym, rozwijana kontrola

W mongo Używam pola dyskryminatora do zapisania aktualnego typu, w C# DocumentDb nie mogę znaleźć tej samej funkcji.

poniżej to przykład tego, jak mongo przechowuje strukturę mojej klasy.

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

W documentdb struktury wygląda

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

Jak widać wersja Mongo ma „'t” własność stwierdzający rzeczywisty typ ten jest następnie wykorzystywany, kiedy odczyt danych, aby stworzyć prawidłowy typ. W wersji documentdb jest to po prostu typ pola:

+0

Prawidłowa obsługa JsonSerializerSettings wreszcie opracowywane przez MS: https://github.com/Azure/azure-documentdb-dotnet/issues/229 – AndyJ

Odpowiedz

3

Po wielu tygodniach poszukiwań w końcu natknąłem się na odpowiedź

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

Zasadniczo ta biblioteka rozszerza DocumentDb w C# SDK oraz pozwala na niestandardowe ustawienia JSON być stosowane. Pod maską użytkownicy sterownika documentdb json.net.

Teraz otrzymuję właściwość "typ $", która jest funkcją wbudowaną w doskonałą bibliotekę json.net newtonsoft.

Moje json wygląda teraz jak

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

Zastanawiam się, czy faktycznie musisz to zrobić w ogóle w DocumentDb.

można przypisać rodzaj takich jak:

private TextBoxControl GetControl(string link) 
{ 
    return client.CreateDocumentQuery<TextBoxControl>(link, "SELECT TOP 1 * FROM Controls"); 
} 

Moja składnia może być na zewnątrz ale CreateDocumentQuery<T> część powinna zrobić to, czego potrzebujesz, bez konieczności przechowywania typ.

+0

przyszły ewentualnie pracować dla niektórych scenariuszy. Ale moja specyficzna konfiguracja nie znam typu, stąd typ jest przechowywany w jsonie. –