2010-03-08 21 views
33

Czytałem o Command Query Responsibility Segregation (CQRS). Zastanawiam się, jak by to działało z ASP.NET MVC? Wpadłem na pomysł, że CQRS konceptualnie brzmi dobrze i na pewno wprowadza pewne komplikacje (wzór zdarzeń i komunikatów) w porównaniu do podejścia "normalnego/wspólnego". Także idea CQRS w pewnym sensie przeciwko użyciu ORM. Próbuję pomyśleć, w jaki sposób mogę użyć tego wzorca w nadchodzących projektach, więc jeśli ktoś ma doświadczenie w łączeniu CQRS z ASP.NET MVC i NHibernate, proszę podać konkretne przykłady, które pomogą mi lepiej zrozumieć CQRS i używać z ASP.NET MVC. Dzięki!Jak zarządzać segregacją odpowiedzialności zapytania (CQRS) za pomocą ASP.NET MVC?

Zaktualizowałem: Przeszukałem przykładowy kod Marka. To musi przeczytać, jeśli uczysz się CQRS.

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/

Odpowiedz

18

Cqrs sprawia, że ​​projekt internetowej jest znacznie łatwiejsze. W witrynie get wszystkie zapytania będą wyglądać tak, jak: "wybierz * z tabeli, gdzie id = @id"). Dla tych prostych pytań nie będziesz potrzebować orm jak NHiberante. Nie musisz używać bazy danych sql, a kiedy to zrobisz, możesz serializować obiekt do tabeli bazy danych lub użyć konwencji nazewnictwa. Nadal możesz przesyłać zapytania do bazy danych przez NHibernate, ale nie uzyskasz żadnej korzyści, ponieważ wszystkie twoje zapytania będą takie same.

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

Na stronie komend kontrolerów będzie wyglądać następująco:

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); 
    } 
} 

Sterownik wystarczy wysłać wiadomość, a nie wie, gdzie idzie do wiadomości i jakie wynikają z wiadomość jest. Część mvc jest bardzo łatwa do zaprogramowania. Cqrs sprawi, że pisanie strony internetowej aplikacji będzie bardzo nudne, ale możesz sprawić, że będzie bardziej zabawnie, dodając kod, który pomaga użytkownikowi podejmować decyzje (opcjonalnie zwracając json używany przez ajax).

+11

Wygląda to prosto, ponieważ nie dbasz o wynik polecenia, a powinieneś zadbać o nieudane polecenia w dowolnym systemie. Brak odpowiedzialności za kod zawsze ułatwia. –

25

Proszę spojrzeć na moje DDDsample.Net projektu na CodePlex. GUI jest realizowany przy użyciu ASP.NET MVC, gdy logika biznesu za pomocą praktyk DDD w 4 różnych wariantach:

  • klasyczny (bez CQRS)
  • CQRS z dwoma NHibernate relacyjnych składnic danych
  • CQRS z LINQ to SQL na zgłoszenie drużyny
  • CQRS z Event Sourcing na stronie poleceń
+0

Dzięki za link! – Jeff

0

Powyżej znajduje się pełna przykład napisałem dla my CQRS lib Scritchy:

Tworzenie aplikacji CQRS korzystając the Scritchy nuget package jest dość prosta i gets you up and running in a few minutes

0

W poniższym wątku można znaleźć ciekawe zasoby: How to adapt CQRS to projects

Ten, który znalazłem szczególnie interesująca jest CQRS Journey, z firmy Microsoft. Może to wyglądać rozczarowująco na jego zależność z Windows Azure, ale czekać ... Ma bardzo przyjemną implementację Event Store i Enterprise Service Bus w SQL Server. W kodzie źródłowym aplikacji Demo znajdziesz wiele komentarzy, które ostrzegają przed użyciem implementacji SQL w produkcji ... ale dzięki kilku poprawkom możesz ją dostosować do swojego projektu. Zrobiłem to i działa bardzo, bardzo dobrze.

Kod jest czysty (pochodzi od chłopaków z Microsoft Patterns i praktyk). Znajdziesz tu dobry przykład użycia iniekcji zależności (z Unity), prostej, ale wydajnej Enterprise Service Bus (z SQL Server i ADO.NET, z równoległymi wątkami), modelu odczytu z Entity Framework i wieloma innymi. Nauczyłem się z niego, jak robić CQRS i Event Sourcing ... Pamiętaj: wszystko o wydarzeniach

Powiązane problemy