0

我目前正在研究MVC 4應用程序。我打算實現一個命令查詢分離模式來增強應用程序的性能和結構。我對我的命令感到滿意 - 它將我的視圖模型映射到我的實體,然後使用nhibernate保存我的數據。 命令和查詢將從同一個數據庫運行。CQS查詢 - 自動生成ADO映射到查看模型?

我有點不確定管理我的查詢的最佳方法。在我上一個項目中,我使用了存儲過程來完成所有讀取/查詢,然後使用automapper將我的IDataReaders映射到ViewModels。這工作正常,但主要的問題是編寫存儲過程的時間以及域模型更改存儲過程失去同步時。

因此,理想情況下,我希望自動生成視圖模型中的視圖或sprocs。但實際上,我看不到這樣做的一種方式。由於Sprocs/Views需要關於可能多於一個表的一些知識。因此,簡單地反思視圖模型屬性是不夠的。 我可以自動爲每個視圖模型生成一個表,在開發過程中閱讀這個表,然後一旦域穩定並且在我們去測試之前將它們轉換爲views/sprocs?

所以我猜我問的是:

  1. 有沒有人設法解決我上面描述的存儲過程/視圖自動生成問題? (這將是我最喜歡的結果!)或者甚至更好設計了一個更優雅的解決方案!
  2. 或者,只有在絕對必要的情況下執行原始ADO讀取(例如搜索),並且免除了大量sprocs/views的需求,這樣才更明智。 但是,然後仍然將我的查詢分隔成一個單獨的渠道(但其中一些他們使用NHibernate,而其他人使用我的ADO閱讀器)。

(P.S我已經看了看其他計算器CQS相關的問題,我希望我的是足夠的不同來保證這個問題)

回答

1

存儲過程有什麼解決的嗎?爲什麼你不能使用NHibernate進行讀取呢?查詢NHibernate產生的不好?

如果讀取的性能對您至關重要,並且您的視圖模型的形狀與您存儲模型的方式有很大不同 - 使非規範化過程變爲視圖模型太重而無法實時完成,那麼您可能必須考慮完全拆分讀取和寫入。

當你寫東西的時候,你可以引發一個事件 - 通常是異步完成的 - 哪些訂閱者可以在readside上存儲數據,這樣讀取是最優的(接近你的viewmodel的形狀)。這會使查詢真的很快。

因爲一張圖片勝過一千字更多..

enter image description here

您可以閱讀很好地介紹了CQRS here

+0

歷史上我們有一些性能很差的NH查詢,隨着時間的推移已經退化。所以Sproc的方法是改善這一點。我也熱衷於單獨命令和查詢提供的靈活性。我喜歡你在保存之後展開域模型並將這些查詢表寫入的建議。我將研究這一點。在這個階段,它可能只是在同一個過程中。謝謝。 – jonho