2010-03-08 34 views
33

我一直在閱讀有關Command Query Responsibility Segregation (CQRS)。我有點想知道這將如何與ASP.NET MVC的工作?從概念上講,我認爲CQRS的概念聽起來不錯,而且肯定會引入一些複雜性(事件和消息傳遞模式)與「正常/常見」方法相比。此外,CQRS的思想在某些方面反對使用ORM。我想如何在即將到來的項目中使用這種模式,所以如果任何人有將CQRS與ASP.NET MVC和NHibernate結合的經驗,請給出一些具體的例子來幫助我更好地理解CQRS並用於ASP.NET MVC。謝謝!如何使用ASP.NET MVC命令查詢責任隔離(CQRS)?

更新: 我一直在經歷馬克的示例代碼。如果你正在學習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/

回答

18

CQRS使得Web項目要容易得多。在獲取網站上,所有查詢將看起來像 「select * from table where id = @id」)。對於那些簡單的查詢,你不需要像NHiberante這樣的orm。您不必使用SQL數據庫,並且您可以隨時將對象序列化到數據庫表,或使用命名約定。你仍然可以通過NHibernate查詢讀取的數據庫,但是你不會從中得到任何好處,因爲你的所有查詢都是一樣的。

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

在命令方面,控制器將是這樣的:

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

控制器只是發送一條消息,它不知道在哪裏的消息轉到什麼的結果消息是。這個mvc的一部分非常簡單。 Cqrs會讓應用程序的Web部分非常無聊,但通過添加一些幫助用戶做出決定的代碼(可選地返回由jjax使用的json),您可以使它變得更有趣。

+11

它看起來很簡單,因爲你不關心你的命令結果,你應該關心任何系統中的失敗命令。對代碼沒有任何責任總是使它更容易。 – 2012-04-20 08:18:23

25

請看看我的DDDsample.Net在CodePlex項目。 GUI是在使用DDD實踐在4個不同變種的業務邏輯使用ASP.NET MVC實現:

  • 經典(無CQRS)
  • CQRS兩個NHibernate的關係數據存儲
  • CQRS與LINQ到SQL對命令側報表方面
  • CQRS與事件採購
+0

感謝您的鏈接! – Jeff 2010-03-14 22:24:14

0

在下面的帖子你可能會感興趣的資源:How to adapt CQRS to projects

的一個,我發現特別有趣的是CQRS Journey,從微軟。它對Windows Azure的依賴性看起來可能會讓人失望,但請等待......它在SQL Server中有一個很好的Event Store和Enterprise Service Bus實現。您會在Demo App源代碼中發現很多評論,警告您不要在生產環境中使用SQL實現......但只需稍作調整即可將其應用於您的項目。我做到了,而且非常好。代碼是乾淨的(它來自微軟模式和實踐的傢伙)。你會發現一個很好的例子,說明如何使用依賴注入(使用Unity),簡單而有效的企業服務總線(使用SQL Server和ADO.NET,並行線程),使用Entity Framework的讀取模型等等。我從中學到了如何做CQRS和事件採購......請記住:關於事件