2009-06-01 25 views
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.ASP.Net MVC mit Webservice als Modell?

Antwort

3

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

Ein Web-Service deckt die Funktionalität für verschiedene Arten von Anwendungen auf, meistens nicht für die Abstraktion in einer einzigen Anwendung. Sie denken wahrscheinlich eher daran, Befehle zu kapseln und so zu lesen, dass sie Ihre Programmierung nicht stören.

Verwenden Sie einen Dienst von einem Servicebus, wenn Sie nach der Entkopplung suchen und ein asynchrones Muster in Ihren asynchronen Seiten erstellen möchten. Sie können Rhino.ServiceBus, nServiceBus und MassTransit für .NET-native Implementierungen und RabbitMQ für etwas anderes sehen http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/.

Edit: Ich hatte einige Zeit, um Kaninchen auf eine Art und Weise zu versuchen, die Nachrichten zu meinem Dienst schob, die wiederum Updates auf die Buchhalter-App geschoben. 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 Service-Schnittstellen bereitstellen. Lesen Sie Eric Evans Domain Driven Design für eine detailliertere Beschreibung.

REST-ful Service-Schnittstellen befassen sich sehr viel 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 eine look at this. (In meiner ersten Version dieses Artikels beklagte ich REST für "langsam", 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 Lazy Collection wegen Code-zu-Implementierung, Datenzugriff Leckage - Sie müssen immer Ihre Db-Kontext, wo Ihre Abfrage-Code usw. ist im Vergleich zu zum Beispiel LightSpeed ​​(kommerziell) oder NHibernate. Spring.Net ermöglicht es Ihnen auch, Service-Interfaces in ihren Containern mit einer Web-Service-Fassade zu umhüllen, aber ich denke, es ist ein wenig zu kompliziert in seiner Konfiguration (ohne es für eine Weile durchsucht zu haben).

Edit 1: Mit ADO.Net meine ich die Standard "Best Practice" mit DataSets, DataAdapter und Iteration 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 mich nicht entweder beeindrucken!)

Edit 1: Erstellen Sie Ihre Domain-Schicht 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 zu tun.

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 (edit 1)

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

Sie haben ein sehr paralleles Framework erstellt, das Co-Routinen verwendet, einschließlich des eigenen elastischen Thread-Pools.

An alle Neinsager in dieser Frage, in Ihrem Gesicht: p! Listen to this screen-cast, vor allem um 12 Minuten.

The actual framework is here.

Wenn Sie in diese Art der Programmierung sind, haben einen Blick auf how monads work und their implementations in C#. Sie können auch auf CoRoutines nachlesen.

Frohes neues Jahr!

-Update 2010-11-27 (edit 2)

Es stellte sich heraus Koroutinen wurde mit der Aufgabe parallel Bibliothek von Microsoft productized. Ihre Aufgabe implementiert jetzt dieselben Funktionen, da sie IAsyncResult implementiert. Caliburn ist ein cooler Rahmen, der sie benutzt.

Reaktive Erweiterungen nahmen die Monad-Kenntnisse auf die nächste Stufe der Asynchronität. Die Welt von ALT.Net 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.

+0

Sie vergleichen ADO.Net mit ORM (Absatz # 4)? Meintest du LINQ2SQL oder EF? – MotoWilliams

+0

Nun, ORM verwendet ADO.Net; Ich habe sie jeweils als Hauptschnittstelle zur Datenbank verwendet, in diesem Fall macht es Sinn. – Henrik

+0

N + 1 auf ado.net? Ich meine ernsthaft .... Lazy-geladene Sammlungen verursachen nur N + 1 in bestimmten Szenarien, die Sie mit Nhibernate erreichen. Das ist der Grund, warum Sie pro-query eifrig laden durch Fetch-Strategien in einem vernünftigen ORM da draußen haben, einschließlich linq2sql. Zufälligerweise läuft nhibernate ado.net darunter für Ihre db-Verbindung ... – SerialSeb

3

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

28

Wie wahrscheinlich oder nützlich ist es, dass 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, von denen sie abhängen. Wenn Sie ein RDBMS für Speicher verwenden, ist dies der Kern Ihrer Architektur. Sich von der DB zu abstrahieren, 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 für eine ausgereifte Technologie oder ActiveRecord/linq2sql für ein einfacheres aktives Datensatzmuster über Ihren Daten ansehen.

Jetzt, da Sie Ihre Datenstrategie an Ort und Stelle haben, haben Sie eine Domäne von einer Art.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, während Sie auf die externen Schichten Ihrer Lösung zugehen.

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

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

Abhängig von Ihrem genauen Szenario, aber Remote-XML-basierten Dienst als das Modell in MVC, aus Erfahrung, keine gute Idee, es ist wahrscheinlich über-Engineering und ignorieren die Notwendigkeit für eine Domäne zu beginnen.

+0

In zunehmendem Maße müssen Unternehmensanwendungen eine Datenbank von jedem Hersteller verwenden können, und Ihre Software sollte dazu in der Lage sein. Viele Unternehmen haben zum Beispiel Lizenzen für Oracle, neigen jetzt aber zu MySql. – Liao

+2

Requiring Switching-Datenbanken ist eine teure Abstraktion zu erzwingen, und eine teure Umstellung zu machen. Es ist eine dieser Anforderungen an die Architektur von Astronauten, die, wenn der Switch auftritt, immer noch so viel kostet. Für die meisten Szenarien ist es viel besser, eine Datenbank zu erstellen. Sollte die Anforderung eines Switches auftreten, wird es trotzdem kosten, und ich argumentiere, dass es möglicherweise viel weniger kostet, als für datenbankunabhängige Szenarien zu entwerfen. Selbst wenn Sie ein ORM a la nhibernate verwenden, wird es immer noch Inkonsistenzen, Inkompatibilitäten, Variablensortierung usw. geben. – SerialSeb

+2

"Wie wahrscheinlich oder nützlich ist es, wenn Ihre MVC-App von Ihrer Datenbank entkoppelt ist?" - Ich verstehe nicht, warum jedes andere Plakat der Person, die die Frage stellt, sagen muss, dass sie falsch ist, es sei denn, es passt zu Ihrem selbst auferlegten Modell, die Vorbedingungen der Frage zu widerlegen (anstatt es zu stellen) Frage sich selbst! – Henrik

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 verwendet wird (< 5000).

Auf der anderen Seite, wenn Sie planen auf einer Website, die von Millionen zugegriffen wird, müssen Sie denken, verteilt, und das bedeutet, dass Sie Ihre Website in einer Weise erstellen müssen, dass es skalieren kann/out. 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 möglicherweise persistente Warteschlangen wie msmq verwendet.

Ich hoffe, das hilft