2017-03-22 4 views
0

Ich versuche zu verstehen, wie ich das MVVM-Muster für eine CRUD-Operation verwenden sollte. Derzeit habe ich Methoden in meinem API-Controller wie unten. Meine Frage ist: Verwenden MVVM Muster, sollte ich noch meine API so bauen (z. B. Zugriff auf DB)? Oder sollte es geändert werden? Wenn sich nichts ändert, in welchem ​​Fall würde ich ViewModels implementieren und wie sollten sie von der API verwaltet werden? Ich habe ein paar Nachforschungen angestellt, aber es ist immer noch nicht klar für mich.Asp .NET Web API mit MVVM Muster

Antwort

2

Ich denke, ein Teil des Problems ist, dass Sie die Rolle von MVVM in einer Webanwendung nicht verstehen. Um dies zu verstehen, müssen Sie sich eine Webanwendung anschauen, die aus zwei separaten Anwendungen besteht - der Serverseite und der Clientseite.

Server-Seite, das verwendete Muster ist MVC (nicht überraschend, es heißt ASP.NET MVC aus einem Grund). Wenn Sie versuchen, Ihr Verständnis von MVVM um das MVC-Muster zu erweitern - nicht. Es trifft nicht zu. Das MVC-Muster auf dem Server ist einfach zu verstehen und zu implementieren; versuche nicht, irgendeinen MVVM hineinzukrachen. Entwerfen Sie einfach Ihren serverseitigen Code mit dem serverseitigen Muster.

Client-Seite ist eine andere Sache. Standardmäßig rendert ASP.NET MVC mit Razor-Seiten Ihren HTML-Code auf dem Server und liefert ihn zur Anzeige an den Client. Und in der Regel soll HTML auf die Interaktion der Benutzer mit der Seite reagieren, indem es auf dem Server zurückschickt. Ihre Controller-Methoden interpretieren diese Postbacks, führen die erforderliche Logik aus und geben die richtige Rasiererseite als Antwort aus. Aber das ist nicht die einzige Möglichkeit, eine Website zu schreiben.

Immer häufiger werden Einzelblattanwendungen entwickelt. Diese verwenden Ajax-Callbacks, um das Ergebnis von Benutzeraktionen zurück an den Server zu senden und die Antwort zu verarbeiten. Serverseitig werden diese Anforderungen fast immer über eine WebApi-Controller-Methode und nicht über eine ASP.NET MVC-Controller-Methode gehandhabt. Die Anfrage kommt als Ajax über die Leitung und das Ergebnis wird normalerweise als Ajax zurückgegeben. Kein HTML wird gerendert. Hier kommt MVVM ins Spiel.

Client-Seite verwenden diese Webseiten in der Regel ein JavaScript MVVM (ish) Framework, wie knockoutjs oder angular. Die Antwort json wird verwendet, um Ansichtsmodelle zu aktualisieren, die an HTML-Elemente in der Webseite gebunden sind. Diese Frameworks verarbeiten Synchronisierungsaktualisierungen und Benutzeraktionen zwischen der Benutzeroberfläche und diesen Ansichtsmodellen, so wie Bindings Updates zwischen der Benutzeroberfläche und Ihren Ansichtsmodellen in WPF synchronisiert.

Einfach gesagt, ist MVC seine eigene Sache, und MVVM existiert normalerweise nur innerhalb der Kundenseite einer Website, und normalerweise nur, wenn die Website ausgiebig Ajax-Rückrufe anstelle von Postbacks verwendet. Wenn Sie MVVM auf der Client-Seite verwenden und Ajax-Aufrufe verwenden, um Ihre CRUD-Operationen auszuführen, sollten Sie Ihre WebApi-Controller-Methoden so entwerfen, dass Sie Ihre Daten posten, abrufen, löschen und löschen können.

+0

Dank wird. Also ich denke, es war nur ein Missverständnis der Konzepte. In Bezug auf den Code denke ich, dass ich bereits das Richtige denke, sobald ich meine APIs zum Posten/Holen/Setzen/Löschen habe und meine Ansicht Ajax-Methoden für meine API anfordert. Es ist eine Weile her, dass ich meine Server-Seite mit Web-API aufbaute und aus meiner Sicht verwendete ich normalerweise jQuery-Plug-Ins, die die API-Methoden von Ajax anfordern. Ich beginne jetzt mit Blick auf Angular (Baby Steps) und ich stieß auf das MVVM-Konzept und ich war verwirrt. Danke für die Klarstellungen (bitte korrigieren Sie das, was ich gerade gesagt habe, falls nötig), Prost. – jtron

1

Persönlich verwende ich immer das Repository-Muster für alles, was mit CRUD-Operationen zu tun hat, z. B. die Interaktion mit einer Entität in einer Datenbank.

Ich würde eine separate Klasse namens "ProductRepository" erstellen und alle Methoden zum Abrufen, Erstellen, Aktualisieren und Löschen eines Produkts in dieser Klasse. Auf diese Weise kümmert sich nur Ihr Repository um die Details der Interaktion mit der Datenbank und die Durchführung der CRUD-Operationen. Ihre gesamte Anwendung sollte sich nicht darum kümmern, wie dies geschieht, sondern nur Ihre Repository-Klasse. Dies ist etwas, das als das Prinzip der einfachen Verantwortlichkeit bekannt ist. Es ist Teil der "SOLID" -Prinzipien von Design und Architektur.

Dann in Ihrem Controller oder ViewModel oder wo auch immer Sie es brauchen, müssen Sie nur das ProductRepository instanziieren und seine Methoden in Ihrer gesamten Anwendung verwenden.

Wenn Sie eine separate Web-API für Ihre Serviceebene und Datenzugriffsebene verwenden, benötigen Sie MVC nicht wirklich. Sie benötigen lediglich ein Front-End-Framework, um die Web-API-URLs wie AngularJS oder ein beliebiges anderes JS-Framework Ihrer Wahl zu verwenden.

Wenn Sie MVC verwenden möchten, dann brauchen Sie nicht wirklich Web API. Sie können Ihre Service-Schicht und Datenzugriffsebene einfach in der MVC-Anwendung erstellen oder sie als separate Projekte (Klassenbibliotheken) erstellen und in Ihre Gesamtprojektlösung integrieren. Alles hängt davon ab, wie die Architektur sein soll und wie komplex sie sein soll.

Aber so oder so, sollte ein "ProductRepository" beteiligt sein - ob in Ihrer Web-API (wenn Sie diese Route gehen), oder in Ihrem MVC-Projekt (wenn Sie diese Route gehen). Das ultimative Ziel ist eine Trennung der Interessen. Sie möchten Ihre Geschäftslogikschicht von Ihrer Datenzugriffsebene trennen. Sie möchten nicht direkt in der gesamten Anwendung auf die Datenbank zugreifen. Dies führt zu Code, der sehr eng gekoppelt ist und im Laufe der Zeit schwer zu testen und zu warten ist. Wenn Sie jemals Datenbanken in der Zukunft ändern, möchten Sie nur einen Platz im Code statt vieler Orte aktualisieren.

Hoffe das hilft Ihnen einige! Mit freundlichen Grüßen und fröhliche Codierung !!!

+0

Danke für die Klarstellungen zu den Repositories, Chase. Sehr hilfreich. – jtron