ASP.Net MVC mit Web-Service als Modell?

8

Hat jemand Ratschläge oder Tipps zur Verwendung eines Webdienstes als Modell in einer ASP.Net MVC-Anwendung? Ich habe niemanden gesehen, der darüber geschrieben hat. Ich möchte eine MVC-App erstellen, aber nicht mit einer bestimmten Datenbank verknüpfen oder die Datenbank auf die einzelne MVC-App beschränken. Ich fühle, dass ein Webdienst (RESTful, höchstwahrscheinlich ADO.Net Data Services) der richtige Weg ist.

    
user50494 01.06.2009, 20:21
quelle

4 Antworten

3

Bearbeiten 2010-11-27; klärte meine Gedanken, die wirklich benötigt wurden.

Ein Web-Service macht Funktionalität für verschiedene Arten von Anwendungen verfügbar, meistens nicht für Abstraktionen in einer einzigen Anwendung. Sie denken wahrscheinlich eher über eine Möglichkeit nach, Befehle einzubinden und so zu lesen, dass sie Ihre Programmierung nicht stören.

Verwenden Sie einen Dienst von einem Servicebus, wenn Sie nach dem Entkoppeln suchen, und führen Sie ein asynchrones Muster auf Ihren asynchronen Seiten aus. Sie können Rhino.ServiceBus, nServiceBus und MassTransit für .NET-native Implementierungen und RabbitMQ für etwas anderes sehen Ссылка .

Edit: Ich hatte einige Zeit, um Hasen auf eine Art und Weise auszuprobieren, die Nachrichten an meinen Dienst weitergab, was wiederum Aktualisierungen an die Buchhaltungs-App weitergab. RabbitMQ ist ein Nachrichten-Broker, auch bekannt als MOM (Message Oriented Middleware), mit dem Sie Nachrichten an Ihren Anwendungsserver senden können.

Sie können auch einfach Serviceschnittstellen bereitstellen. Lesen Sie Eric Evans Domain Driven Design für eine detailliertere Beschreibung.

REST-ful Service-Schnittstellen befassen sich sehr mit Daten und insbesondere mit adressierbaren Ressourcen. Es kann Ihr Programmiermodell erheblich vereinfachen und ermöglicht eine große Kontrolle über die Ausgabe über das HTTP-Protokoll. Das kommende Programmiermodell von WCF verwendet den in der ursprünglichen Dissertation definierten wahren Ruhezustand, wobei jedes Dokument in gewissem Umfang URIs für die fortgesetzte Navigation bereitstellen sollte. Habe ein schau dir das an . (In meiner ersten Version dieses Beitrags beklagte ich REST, dass er "langsam" ist, was auch immer das bedeutet.) REST-basierte APIs sind auch ziemlich genau das, was CouchDB und Riak verwendet.

ADO.Net ist eher Mist (!) [N + 1 Probleme mit fauler Sammlung wegen Code-zu-Implementierung, Datenzugriffsleck - Sie brauchen immer Ihren DB-Kontext, wo Ihr Abfragecode usw. ist] im Vergleich zu für Beispiel LightSpeed ​​(kommerziell) oder NHibernate. Spring.Net ermöglicht es Ihnen auch, Serviceschnittstellen in ihren Containern mit einer Webservice-Fassade zu umhüllen, aber (ich habe sie eine Weile nicht durchsucht), ich denke, dass sie in ihrer Konfiguration ein bisschen zu kompliziert ist.

Edit 1: Mit ADO.Net meine ich die Standard "Best Practice" mit DataSets, DataAdapter und wiederhole viele Zeilen von einem DataReader; es erzeugt ziemlich hässlichen und schwer zu debuggenden Code. Das N + 1 Zeug, ja, das ist das Entity-Framework.

(Edit 2: EntityFramework beeindruckt mich auch nicht!)

Bearbeiten 1: Erstellen Sie Ihre Domain-Ebene in einer separaten Assembly [aka. Core] und stellen Sie alle Domänen- und Anwendungsdienste dort bereit, und importieren Sie diese Assembly dann von Ihrer spezifischen MVC-Anwendung. Wickeln Sie den Datenzugriff in einem DAO / Repository über eine Schnittstelle in der Core-Assembly ein, die von Ihrer Data-Assembly referenziert und implementiert wird. Verdrahten Sie Schnittstelle und Implementierung mit IoC. Sie können sogar etwas für die dynamische Service-Erkennung mit den oben genannten Service-Bussen programmieren, um die Schnittstellen zu lösen. WCF verwendet Schnittstellen wie diese und so tun die meisten der oben genannten Service-Busse; Sie können einen Subkomponentenresolver in Ihrem IoC-Container bereitstellen, um dies automatisch durchzuführen.

Bearbeiten 2: Eine gute Kombination für die oben genannten wäre CQRS + EventSourcing + ReactiveExtensions. Ihr Schreibmodell würde Befehle annehmen, Ihr Domänenmodell würde entscheiden, ob es akzeptiert wird, es würde Ereignisse in die Pipeline für reaktive Erweiterungen schieben, vielleicht auch über RabbitMQ, das Ihr Lesemodell verbrauchen würde.

Update 2010-01-02 (Bearbeiten 1)

Der Scherz meiner Idee wurde durch etwas namens MindTouch Dream kodifiziert. Sie haben einen Screencast erstellt, in dem sie fast alle Teile einer Webanwendung als (Web-) Service behandeln, der auch mit REST verfügbar gemacht wird.

Sie haben ein hochparalleles Framework erstellt, das Co-Routinen verwendet, um das zu handhaben, einschließlich ihres eigenen elastischen Thread-Pools.

An alle Nein-Sager in dieser Frage, in Ihrem Gesicht: p! Hören Sie sich diese Bildschirmauszählung an, vor allem um 12 Minuten.

Das eigentliche Framework ist hier.

Wenn Sie an dieser Art von Programmierung interessiert sind, schauen Sie sich an, wie Monaden funktionieren und ihre Implementierungen in C # . Sie können auch auf CoRoutines nachlesen.

Frohes neues Jahr!

Update 2010-11-27 (Bearbeiten 2)

Es stellte sich heraus, dass CoRoutines mit der parallelen Task-Bibliothek von Microsoft produktiviert wurde. Ihre Aufgabe implementiert jetzt dieselben Funktionen, da sie IAsyncResult implementiert. Caliburn ist ein cooler Rahmen, der sie verwendet.

Reaktive Erweiterungen haben die Monad-Comprehensions auf die nächste Ebene der Asynchronität gebracht.

Die ALT.Net-Welt scheint sich in die Richtung zu bewegen, über die ich gesprochen habe, als ich diese Antwort das erste Mal geschrieben habe, allerdings mit neuen Arten von Architekturen, von denen ich wenig wusste.

    
Henrik 01.06.2009, 20:34
quelle
28

Wie wahrscheinlich oder nützlich ist es, wenn Ihre MVC-App von Ihrer Datenbank entkoppelt ist? Wie oft haben Sie in Ihrer Anwendungslebenszeit einen Wechsel von SQL Server zu Oracle gesehen? Aus den letzten 10 Jahren meiner Projekte ist es nie passiert.

Architekturen sind wie Zwiebeln, sie haben Schichten von Abstraktionen über Dinge, auf die sie angewiesen sind. Wenn Sie ein RDBMS für Speicher verwenden, ist dies der Kern Ihrer Architektur. Sich von der DB abstrahieren zu lassen, so dass man sie tauschen kann, ist ein Trugschluss.

Jetzt können Sie Ihren Datenbankzugriff von Ihrer Domäne entkoppeln, und das Repository-Muster ist eine der Möglichkeiten, dies zu tun. Die meisten ausgereiften Lösungen verwenden heutzutage ein ORM. Daher sollten Sie sich NHibernate ansehen, wenn Sie eine ausgereifte Technologie benötigen, oder ActiveRecord / linq2sql für ein einfacheres aktives Datensatzmuster über Ihren Daten.

Nachdem Sie Ihre Datenstrategie eingerichtet haben, haben Sie eine Domäne. Wenn Sie Daten Ihrem Client zur Verfügung stellen, können Sie dies über ein MVC-Muster tun, bei dem Sie normalerweise aus Ihrer Domäne generierte DTOs zum Rendern senden. Alternativ können Sie einen Architekturstil wie REST verwenden, um lose gekoppelte Systeme bereitzustellen , indem Sie Links und benutzerdefinierte Darstellungen bereitstellen.

Sie gehen von enger Kopplung zu lockerer Kopplung über, wenn Sie auf die externen Schichten Ihrer Lösung zugehen.

Wenn Sie jedoch eine MVC-App über einer REST-Architektur oder Web-Services erstellen und diese als Modell verwenden möchten ... Warum sollten Sie sich die Mühe machen? Wenn Sie ein Domänenmodell haben, warum nicht es in Ihrem System verwenden und Ihre Dienste, wo es sinnvoll ist?

Das Generieren einer UI von einer MVC-App und das Erzeugen von Dokumenten, die für eine REST-konforme Architektur benötigt werden, sind zwei völlig unterschiedliche Kontexte, die aufeinander aufbauen und nur viel mehr Schmerzen verursachen als nötig. Und Sie opfern Leistung.

Hängt von Ihrem exakten Szenario ab, aber Remote-XML-basierter Dienst als Modell in MVC, aus Erfahrung, keine gute Idee, es ist wahrscheinlich über-Engineering und ignorieren die Notwendigkeit für eine Domäne zu beginnen.

    
SerialSeb 03.06.2009 02:03
quelle
3

Sie sollten Ihre Modelle auf eine datenzugriffsunabhängige Weise definieren, z. Verwenden des Repository-Musters. Dann können Sie konkrete Implementierungen erstellen, die von bestimmten Datenzugriffstechnologien (Web Service, SQL usw.) unterstützt werden.

    
DSO 01.06.2009 20:46
quelle
0

Es hängt wirklich von der Größe dieses mvc-Projekts ab. Ich würde sagen, dass die Benutzeroberfläche und die Domain in derselben Umgebung bleiben, wenn die Website von einer kleinen Anzahl von Benutzern (& lt; 5000) verwendet wird.

Wenn Sie andererseits auf einer Website planen, auf die von Millionen zugegriffen wird, müssen Sie denken, dass sie verteilt werden müssen, und das bedeutet, dass Sie Ihre Website so erstellen müssen, dass sie beliebig skaliert werden kann. Das bedeutet, dass Sie möglicherweise zusätzliche Server (Web, Anwendung und Datenbank) verwenden müssen.

Damit dies funktioniert, müssen Sie Ihre mvc UI-Site von der Anwendung entkoppeln. Die Anwendungsschicht enthält normalerweise Ihr Domänenmodell und wird möglicherweise über WCF oder einen Servicebus verfügbar gemacht. Ich würde einen Service Bus bevorzugen, weil es zuverlässiger ist und persistente Warteschlangen wie msmq verwenden kann.

Ich hoffe, das hilft

    
Jalal El-Shaer 30.11.2011 09:18
quelle