2010-03-08 13 views
33

Ich habe über Command Query Responsibility Segregation (CQRS) gelesen. Ich wundere mich, wie würde das mit ASP.NET MVC funktionieren? Ich bekomme die Idee von CQRS konzeptionell klingt es schön und sicher bringt einige Komplexitäten (Event-und Messaging-Muster) im Vergleich zu den "normalen/gemeinsamen" Ansatz. Auch die Idee von CQRS ist in gewisser Weise gegen die Verwendung von ORM. Ich versuche zu denken, wie ich dieses Muster in den kommenden Projekten verwenden könnte. Wenn jemand Erfahrung in der Kombination von CQRS mit ASP.NET MVC und NHibernate hat, gebe ich einige konkrete Beispiele, die mir helfen, CQRS besser zu verstehen und mit ASP.NET MVC zu verwenden. Vielen Dank!Wie kann die Zuständigkeitsverteilung (CQRS) mit ASP.NET MVC abgefragt werden?

Aktualisiert: Ich habe Mark Beispielcode durchlaufen. Es ist ein Muss, wenn Sie CQRS lernen.

http://github.com/MarkNijhof/Fohjin

http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/

http://cre8ivethought.com/blog/2009/11/28/cqrs-trying-to-make-it-re-usable/

Antwort

18

Cqrs macht das Web-Projekt viel einfacher. Auf der Get-Site sehen alle Abfragen wie aus "Wählen Sie * aus der Tabelle mit ID = @id". Für diese einfachen Fragen benötigen Sie kein Orm wie NHiberante. Sie müssen keine SQL-Datenbank verwenden, und wann immer Sie möchten, können Sie Ihr Objekt in die Datenbanktabelle serialisieren oder eine Namenskonvention verwenden. Sie können die gelesene Datenbank immer noch mit NHibernate abfragen, aber Sie erhalten keinen Vorteil daraus, da alle Ihre Abfragen identisch sind.

public class Controller 
{ 
    public ActionResult Get(Guid id) 
    { 
    var viewModel = reportingDatabase.Get(id); 
    return View(viewmodel); 
    } 
} 

Auf der Kommando Seite werden die Steuerungen wie folgt aussehen:

public class Controller 
{ 
    public ActionResult Post(SomeForm form) 
    { 
    // do validation 
    var command = new SomeCommand(form.Property1, form.Property2); 
    bus.Send(command); 
    return redirecto(something else); 
    } 
} 

Der Controller nur eine Nachricht senden, und es nicht weiß, wo die Nachricht geht und was das Ergebnis der Nachricht ist. Der mvc-Teil ist sehr einfach zu programmieren. Cqrs wird das Schreiben des Web-Teils der Anwendung sehr langweilig machen, aber Sie können es lustiger machen, indem Sie Code hinzufügen, der dem Benutzer hilft, Entscheidungen zu treffen (optional kann json von ajax verwendet werden).

+11

Es sieht einfach aus, weil Sie das Ergebnis des Befehls nicht interessieren, und Sie sollten sich in jedem System um fehlgeschlagene Befehle kümmern. Keine Verantwortung für Code zu haben macht es immer einfacher. –

25

Bitte nehmen Sie sich einen Blick auf meine DDDsample.Net Projekt auf CodePlex. Die GUI wird mit ASP.NET MVC implementiert, während die Business-Logik Praktiken mit DDD in 4 verschiedenen Varianten:

  • classic (kein CQRS)
  • CQRS mit zwei nHibernate relationalen Datenspeichern
  • CQRS mit LINQ to SQL zur Berichtsseite
  • CQRS mit Ereignis-Sourcing auf Befehl Seite
+0

Danke für den Link! – Jeff

0

Im folgenden Beitrag können Sie interessante Ressourcen finden: How to adapt CQRS to projects

Die eine, die ich besonders interessant fand, ist die CQRS Journey, von Microsoft. Es kann für seine Abhängigkeit mit Windows Azure enttäuschend aussehen, aber warten Sie ... Es hat eine sehr nette Implementierung eines Ereignisspeichers und Enterprise Service Bus in SQL Server. Im Demo-App-Quellcode finden Sie viele Kommentare, die Sie davor warnen, die SQL-Implementierung in der Produktion zu verwenden ... aber mit ein paar Optimierungen können Sie sie an Ihr Projekt anpassen. Ich habe es getan, und es funktioniert sehr, sehr gut.

Der Code ist sauber (es stammt von den Leuten von Microsoft Patterns und Praktiken). Sie finden ein gutes Beispiel für die Verwendung der Abhängigkeitsinjektion (mit Unity), einen einfachen aber effektiven Enterprise Service Bus (mit SQL Server und ADO.NET mit parallelen Threads), ein Lesemodell mit Entity Framework und vieles mehr. Ich habe daraus gelernt, wie man CQRS und Event Sourcing macht ... Denken Sie daran: Alles über Events

Verwandte Themen