2013-06-21 13 views
9

Frage:Breeze und RESTful WebAPI

Welchen Wert hat bieten Brise, wenn ich brauche, um meine eigenen POST/PUT/GET-Endpunkte pro Einheit in WebAPI zu implementieren?

Hintergrund:

This scheint eine gemeinsame Implementierung eines server Breeze Controller zu sein:

[BreezeController] 
public class TodosController : ApiController { 

    readonly EFContextProvider<TodosContext> _contextProvider = 
     new EFContextProvider<TodosContext>(); 

    // ~/breeze/todos/Metadata 
    [HttpGet] 
    public string Metadata() { 
     return _contextProvider.Metadata(); 
    } 

    // ~/breeze/todos/Todos 
    // ~/breeze/todos/Todos?$filter=IsArchived eq false&$orderby=CreatedAt 
    [HttpGet] 
    public IQueryable<TodoItem> Todos() { 
     return _contextProvider.Context.Todos; 
    } 

    // ~/breeze/todos/SaveChanges 
    [HttpPost] 
    public SaveResult SaveChanges(JObject saveBundle) { 
     return _contextProvider.SaveChanges(saveBundle); 
    } 

    // other miscellaneous actions of no interest to us here 
} 

Ich bin in der Mitte eine RESTish API von Gebäuden, das bis zu diesem Punkt, hat Endpunkte wie:

Es scheint, als ob Breeze erfordert die Endpunkte viel einfacher (für besser oder schlechter) - nur ein paar GETS und ein SaveChanges POST-Endpunkt.

Das bringt mich zu der Annahme, dass Breeze eine schnelle Entwicklung mit einem einzigen Web-Client macht, naja, ein Kinderspiel ... aber sobald Sie anonyme Clients haben, müssen Sie sie in die von Ihnen erstellten Brise-Interface-Konventionen zwingen in Ihrem Client, der scheint, um den Zweck des RESTful API-Design zu besiegen. Ist das der Fall?

Antwort

28

Breeze ist, zuerst und formost, ein clientseitiges JavaScript-Framework. Wenn Sie nicht zu

  • Verbesserte OData Abfrage Unterstützung ($ auswählen und $ erweitern Unterstützung, erweiterte $ orderby)
  • Speichern Schnittpunkte (beforeSaveEntity mit Breeze auf dem Client werden die Vorteile von Breeze.WebApi begrenzt und beforeSaveEntities Veranstaltungen)
  • Speichern Ergebnis Handling (aktualisiert Entitätsschlüsseln, Concurrency Spalten)
  • Metadaten-Extraktion und Serialisierung

Wie Sie vermutet haben, Breeze hat eine andere phi Loslichkeit von REST in Bezug auf CRUD-Operationen.

Breeze wurde für Kunden entwickelt, die C/U/D viele verschiedene Ressourcen in einer einzigen Transaktion nutzen möchten. Dies ermöglicht Benutzern, die Daten auf komplexe Weise zu manipulieren, ohne den Server zu treffen, und dann ihre Änderungen zu speichern, wenn sie bereit sind. Zum Beispiel könnte man einen neuen Order erstellen, zwei OrderLineItem s von einem Order in einen anderen verschieben, einen dritten löschen OrderLineItem, die Menge an einem vierten ändern und dann SaveChanges(). Breeze unterstützt sogar die Verwendung von localStorage, um vollständig vom Server getrennt zu arbeiten. Sobald die Verbindung wiederhergestellt ist, können alle Änderungen gespeichert werden.

REST wurde entwickelt, um auf one resource at a time zu arbeiten. Jede C/U/D-Operation muss sofort für den Server ausgeführt werden, damit auf den Antwortcode reagiert werden kann. Es funktioniert gut für Anwendungen mit einfachen Update-Anforderungen, aber nicht für Dateneingabeanwendungen. Während sie transactions can be supported in REST sind, sind sie bestenfalls umständlich.

Abgesehen davon ist Ihre serverseitige Breeze-API nicht auf das beschränkt, was Sie im Todos-Beispiel sehen. Breeze unterstützt Named Saves, mit dem Sie verschiedene Endpunkte für verschiedene Operationen haben können. Sie können auch Save Interception verwenden, um sicherzustellen, dass Ihr Sicherungsbündel nur die Typen enthält, für die es geeignet ist.Und natürlich gibt es nichts, was Sie davon abhält, beide APIs auf Ihrem Server verfügbar zu machen, und beide werden von der gleichen Persistenzschicht gespeist.

Wenn Sie sich zwischen ihnen entscheiden müssen, sollten Sie mit Ihren Benutzern beginnen. Echte Benutzer (nicht Entwickler) interessieren sich nicht für REST, sie kümmern sich darum, was die Anwendung tun kann. Schließlich gibt REST Ihrer Anwendung die gesamte Semantik von HTTP, und Breeze gibt ihr die gesamte Semantik einer relationalen Datenbank oder Objektdatenbank. Welche Version für Ihre Benutzer verfügbar ist, hängt von den Anwendungsfällen ab, die Sie unterstützen müssen.

+0

Kristallklare Antwort! Vielen Dank! – Riscie

+0

Sehr gut geschrieben und vollständige Antwort! – user1789573