2016-05-11 9 views
1

Ich bin neu in Azure App Service Mobile Apps. Ich versuche meine Optionen für die Verwendung von TableController zu verstehen, um komplexe Domänenobjekte für Clients verfügbar zu machen. Mein Ziel bei der Verwendung von TableController ist es, die clientseitige Abfrage und Offline-Synchronisierung zu nutzen.TableController: Glatte persistente Daten in DTO

Tabellen-Controller sind für die Ausführung von CRUD-Operationen auf einfachen DTOs ausgelegt. Also versuche ich herauszufinden, wie ein komplexes Domänenmodell als die Art von DTOs dargestellt werden könnte, die für TableController entwickelt wurde.

Ich habe this post gelesen, die MappedEntityDomainManager erklärt. Dieses Beispiel zeigt eine ziemlich einfache Zuordnung zwischen DTOs und persistenten Objekten. Aber was, wenn ich möchte, dass mein Mapping komplexer ist?

Zum Beispiel lassen Sie uns sagen, ich habe persistenten Typen wie folgt aus:

public class Order { 
    public Customer Customer { get; set; } 
    public IList<OrderItem> OrderItems { get; } 
} 

public class Customer { 
    public string Name { get; set; } 
    public string TelephoneNumber { get; set; } 
} 

public class OrderItem { ... } 

Und ich habe eine Tabelle Controller wie folgt erklärt:

public class OrderController : TableController<OrderDto> 

Könnte die OrderDto dann wie folgt aussehen?

public class OrderDto { 
    public string CustomerName { get; } 
    public string Customer { get; } 
    public string OrderItems { get; } 
} 

Die Zuordnungen wären wie folgt. Die Order.Customer.Name Eigenschaft ist in OrderDto.CustomerName abgeflacht. Das vollständige Objekt Customer ist in OrderDto.Customer serialisiert. Und die Order.OrderItems Liste ist in OrderDto.OrderItems serialisiert.

Kann diese komplexe Zuordnung mit MappedEntityDomainManager durchgeführt werden? Wenn nicht, wie könnte es gemacht werden? Ich weiß über leveraging $expand, aber ich sorge mich, dass ein nicht unterstützter Hack eher als die empfohlene Vorgehensweise sein kann.

+0

Ihr Ansatz sieht mit sqlite auf Client-Seite (App) und mit NoSQL in der Cloud. Dies ist mehr oder weniger wie Amazon Web Services SNC Ansatz, wenn ich richtig verstehe. – batmaci

Antwort

1

Der beste Weg, dies zu tun, ist die Verwendung von Automapper. Der Blogpost war ein einfaches Beispiel, aber Sie können sehr komplexe Mappings mit AutoMapper durchführen.

Hier ist ein komplexeres Beispiel: https://github.com/paulbatum/FieldEngineerLite/blob/master/FieldEngineerLite.Service/Controllers/JobController.cs. Es ist für Azure Mobile Services, aber das gleiche Konzept gilt für Azure Mobile Apps. Sie müssen nur die Namespaces ändern.

+0

Danke für den Tipp, aber das verlinkte Beispiel bevorzugt '$ expand' über Automapper. Dies steht im Gegensatz zu Ihrer Empfehlung, [untergeordnete Objekte in das übergeordnete Objekt einzuschließen] (http://stackoverflow.com/a/32999163). Ich hatte Ihre Herangehensweise in meiner Frage im Hinterkopf, wobei die String-Eigenschaft 'OrderDto.OrderItems' eine Serialisierung der Listeneigenschaft' Order.OrderItems' enthielt. Ist das verknüpfte Beispiel also entweder unpassend oder sollte ich tatsächlich "$ expand" gegenüber dem Automapper bevorzugen, wenn der erste verwendet werden kann? – HappyNomad

+0

@HappyNomad In diesem Beispiel wird expand * und * automapper verwendet. Wenn Sie sich den Domänenmanager ansehen, den er verwendet, ist dies der zugeordnete Entitätsdomänenmanager. –

+0

Ich habe 'DefaultMappedEntityDomainManager' und' AutomapperConfiguration' bemerkt. Obwohl diese Mappings viel einfacher aussehen als meine Beispiele. Wie auch immer, ich denke, Sie empfehlen '$ expand' anstelle von Automapper für Fälle wie mein 'OrderItems'-Beispiel. Also ist '$ expand' ein gültiges Mittel um" untergeordnete Objekte in das übergeordnete Objekt einzuschließen ", richtig? – HappyNomad